>source

양식 제출을받는 Google 시트에서 작업하고 있습니다. 제출이 접수되면 C 열에 표시된 이름에 따라 데이터 행을 다른 탭으로 이동하는 스크립트가 필요합니다.

스택 오버플로에 대한 솔루션을 광범위하게 검색했으며 지금 찾은 코드를 통해 솔루션에 매우 가깝습니다.

이력 날짜를 다른 탭으로 이동하고 오늘보다 오래된 날짜의 논리에 따라 모든 미래 날짜를 원래 탭에 남겨 두는 스크립트가 있습니다.

지금해야 할 일은 C 열에서 이름이 "John"인 행을 John 탭으로 이동하고 날짜를 무시하도록 수정하는 것입니다.

하나의 이름 만 사용하면 여러 이름과 여러 탭에서이 작업을 수행 할 수 있다고 확신합니다.

작업중인 다음 테스트 시트의 사본을 작성하십시오.

링크 : https://docs.google.com/spreadsheets/d/1z_IQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQI edit # gid = 0

function MovePastDates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var entrySheet = ss.getSheetByName("Entry Sheet");
  var franksSheet = ss.getSheetByName("Franks Sheet");  
  var lastColumn = entrySheet.getLastColumn();
  for(var i = entrySheet.getLastRow(); i > 0; i--){
      var dateCell = entrySheet.getRange(i, 1).getValue();
      var today = new Date();
      var test = new Date(dateCell);

      // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
      if(test < today){
        var rangeToMove = entrySheet.getRange(i, 1, 1, entrySheet.getLastColumn()).getValues();
        franksSheet.getRange(franksSheet.getLastRow() + 1, 1, 1, entrySheet.getLastColumn()).setValues(rangeToMove);
        entrySheet.deleteRow(i);
      }
   }       
}

최종 결과는 양식 항목을받는 Google 시트 여야합니다.

각 항목은 양식을 통해 제출 된 요청을 승인/거부 할 수있는 탭만 편집 권한이있는 특정 개인에게 할당됩니다.

시트의 다른 모든 사용자는보기 권한 만 갖습니다.


  • 답변 # 1

    이것이 당신이 원하는 것이라고 생각합니다 :

    function movePastDatesOrJohn() {
      var sObj={John:'Johns Sheet',Frank:'Franks Sheet',David:'Davids Sheet'};
      var ss=SpreadsheetApp.getActive();
      var esh=ss.getSheetByName('Entry Sheet');
      var fsh=ss.getSheetByName('Franks Sheet');
      var erg=esh.getDataRange();
      var evA=erg.getValues();
      var d=0;
      var today=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()).valueOf();
      for(var i=1;i<evA.length;i++) {
        if(new Date(evA[i][0]).valueOf() < today || evA[i][2]=='John') {
          ss.getSheetByName(sObj[evA[i][2]]).appendRow(evA[i]);
          esh.deleteRow(i+1-d);
          d++;
        }
      }
    }
    
    

    그래서 Franks Sheet와 Davids Sheet는 오늘보다 오래된 행만 가져옵니다. 그러나 Johns Sheet는 Johns의 모든 행을 가져오고 날짜를 무시합니다. 나는 그것이 당신이 원하는 것이라고 생각합니다. 그러나 다른 의견을 남겨서 귀하의 질문을 오해 한 경우 알려주십시오. 기쁘다.

    그런데 스프레드 시트에 하나 이상의 양식을 첨부하면 formSubmit 트리거가 이벤트 객체 범위로 어떤 응답 시트에 기록되는지 알 수 있습니다. sheet name = e.range.getSheet().getName(); 사용

  • 답변 # 2

    두 스크립트를 원했습니다 :

    1) 양식 제출 행을 개인의 이름에 따라 특정 탭으로 이동하는 스크립트 (분마다 트리거를 설정하려고했습니다)

    2) 과거 날짜를 과거 시트로 이동시키는 스크립트 (매일 밤마다 트리거를 설정하려고했습니다)

    원하는 기능을 달성하기 위해 코드를 수정할 수있었습니다. 가장 효율적이지는 않지만 잘 작동하는 것 같습니다.

    스크립트 하나는 :

      function moveRowsToNamesSheets() { //Name of function
      var sObj={John:'Johns Sheet',Frank:'Franks Sheet',David:'Davids Sheet'};   // Put key work and sheet name here in format eg.( keyWord1: 'sheet name to move keyWord1 to') 
      var ss=SpreadsheetApp.getActive();                                         // ??
      var esh=ss.getSheetByName('Entry Sheet');                                  //Sheet data is being pulled form
      var fsh=ss.getSheetByName('Franks Sheet');                                 //unsure why one of the sheets is named here
      var erg=esh.getDataRange();                                                // Not sure of function now that I am not using dates
      var evA=erg.getValues();                                                   // ??
      var d=0;                                                                   //??
      //var today=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()).valueOf();  // Didnt need this line
      for(var i=1;i<evA.length;i++) {                                            //??
        if(/*new Date(evA[i][0]).valueOf() < today*/ evA[i][2]=='John' ||evA[i][2]=='Frank' ||evA[i][2]=='David') { //Keywords used go here, what does the [2] mean?
          ss.getSheetByName(sObj[evA[i][2]]).appendRow(evA[i]);                  //??
          esh.deleteRow(i+1-d);
          d++;                                                                   //increments d by one
        }
      }
    }
    
    

    스크립트 2는 다음과 같습니다.

    function HistoricDates() {
      // Initialising
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      //--------------- Franks Sheets --------------------
      var franksSheet = ss.getSheetByName("Franks Sheet");
      var PastSheet = ss.getSheetByName("Historic Requests");  
      var lastColumn = franksSheet.getLastColumn();
      // Check all values from your "Franks Sheet" sheet
      for(var i = franksSheet.getLastRow(); i > 0; i--){
        // Check if the value is a valid date
        var dateCell = franksSheet.getRange(i, 4).getValue();  //Dates in column 4
        if(isValidDate(dateCell)){
          var today = new Date();
          var test = new Date(dateCell);
          // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
          if(test < today){
            var rangeToMove = franksSheet.getRange(i, 1, 1, franksSheet.getLastColumn()).getValues();
            PastSheet.getRange(PastSheet.getLastRow() + 1, 1, 1, franksSheet.getLastColumn()).setValues(rangeToMove);
            franksSheet.deleteRow(i);
          }
        }
      }
      //---------------------- Johns Sheets -------------------------
      var johnsSheet = ss.getSheetByName("Johns Sheet");
      var pastSheet = ss.getSheetByName("Historic Requests");  
      var lastColumn = johnsSheet.getLastColumn();
      // Check all values from your "Johns Sheet" sheet
      for(var i = johnsSheet.getLastRow(); i > 0; i--){
        // Check if the value is a valid date
        var dateCell = johnsSheet.getRange(i, 4).getValue(); //Dates in column 4
        if(isValidDate(dateCell)){
          var today = new Date();
          var test = new Date(dateCell);
          // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
          if(test < today){
            var rangeToMove = johnsSheet.getRange(i, 1, 1, johnsSheet.getLastColumn()).getValues();
            pastSheet.getRange(pastSheet.getLastRow() + 1, 1, 1, johnsSheet.getLastColumn()).setValues(rangeToMove);
            johnsSheet.deleteRow(i);
          }
        }
      }  
        //--------------- Davids Sheets --------------------
      var davidsSheet = ss.getSheetByName("Davids Sheet");
      var pastSheet = ss.getSheetByName("Historic Requests");  
      var lastColumn = davidsSheet.getLastColumn();
      // Check all values from your "Davids Sheet" sheet
      for(var i = davidsSheet.getLastRow(); i > 0; i--){
        // Check if the value is a valid date
        var dateCell = davidsSheet.getRange(i, 4).getValue();//Dates in column 4
        if(isValidDate(dateCell)){
          var today = new Date();
          var test = new Date(dateCell);
          // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
          if(test < today){
            var rangeToMove = davidsSheet.getRange(i, 1, 1, davidsSheet.getLastColumn()).getValues();
            pastSheet.getRange(pastSheet.getLastRow() + 1, 1, 1, davidsSheet.getLastColumn()).setValues(rangeToMove);
            davidsSheet.deleteRow(i);
          }
        }
      }
    }
    // Check is a valid date
    function isValidDate(value) {
      var dateWrapper = new Date(value);
      return !isNaN(dateWrapper.getDate());
    }
    
    

    작업 스프레드 시트는 다음 위치에 있습니다. https://docs.google.com/spreadsheets/d/1VCONRkBpkva-KrFDO2bFV8ZTp1U168QWAGavcKCa_uQ/edit?usp=sharing

관련 자료

  • 이전 javascript - pdfmake에 특수 문자가있을 때 파일 이름이 잘못됨
  • 다음 python - 탐지 작업을위한 신경망 시각화