Google表格-用于根据关键字将行移动到不同标签的脚本

时间:2019-05-08 18:41:45

标签: google-apps-script

我一直在研究接收表单提交的Google工作表。 提交提交后,我需要一个脚本来根据C列中显示的名称将数据行移动到不同的选项卡。

我已经在堆栈溢出中广泛地寻找解决方案,而现在我已经通过找到和编辑的代码非常接近解决方案。

我有一个脚本,该脚本可以将历史日期移动到其他选项卡,并根据日期早于今天的逻辑将所有将来的日期保留在原始选项卡中。

我现在要做的就是修改它,将C列中名称为“ John”的行移至“ John”选项卡,并忽略日期。

一旦我可以使用一个名字,我就有信心可以使用多个名字和多个标签。

请随时创建我一直在努力的以下测试表的副本。

链接: https://docs.google.com/spreadsheets/d/1zJpylrD_5hzScW3lIjIQQSKiY0Aan6Wkm_h_IbVrVXM/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工作表。

每个条目都将分配给一个特定的人,该人仅具有对该选项卡的编辑权限,只有他们可以在其中批准/拒绝通过表单提交的请求。

工作表的所有其他用户将只能查看。

2 个答案:

答案 0 :(得分:0)

我想这就是你想要的:

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();

答案 1 :(得分:0)

我想要两个脚本:

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
    }
  }
}

脚本二是:

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