首页 > 解决方案 > 关闭工作表时如何使用基于时间的触发器执行代码

问题描述

我正在尝试执行下面的代码,我希望它在午夜触发,而不是在我更改第 8 列时执行。我希望当我更改第 8 列时,它直到午夜才移动该行。任何帮助将不胜感激。

function TO_List() {
 // moves a row from a sheet to another when a magic value is entered in a column
 // adjust the following variables to fit your needs
 // see https://productforums.google.com/d/topic/docs/ehoCZjFPBao/discussion
var columnNumberToWatch = 8;
 // column A = 1, B = 2, etc…
 var valueToWatch = 'List';
 var sheetNameToMoveTheRowTo = 'List';
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = SpreadsheetApp.getActiveSheet();
 var range = sheet.getActiveCell();

 if (range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
   var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
   var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
   sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
   sheet.deleteRow(range.getRow());
 }
}

标签: google-apps-script

解决方案


这看起来像一个容器绑定脚本,因此 Spreadsheet.getActive() 可以正常工作,因为您必须在触发器设置中指定电子表格,但 getActiveSheet() 将始终返回与 Spreadsheet.getSheets()[0] 相同的工作表(最左边sheet) 所以如果你想从触发器运行,你可能必须使用 getSheetByName() 。

我不确定,但这可能接近你想要的:

function active_to_List() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var tsh=ss.getSheetByName('List');
  var d=0;
  for(var i=0;i<vA.length;i++) {
    if(vA[i][7]=="List") {
      tsh.appendRow(vA[i]);
      tsh.deleteRow(i+1-d++);
    }
  }
}

推荐阅读