在非活动工作表上运行脚本

时间:2018-11-14 17:08:35

标签: google-sheets triggers eventtrigger

我一直在使用以下脚本将“完成”列从一张纸移动到另一张纸:

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Sheet1" && r.getColumn() == 15  && r.getValue() == 
"Finished") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Finished");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

我试图弄清楚即使未打开或编辑工作表也要如何运行脚本。我只是不确定如何将其更改为每分钟左右使用时间触发器。

1 个答案:

答案 0 :(得分:0)

从onEdit更改为定时触发器有两个方面。
第一个涉及代码的修订,第二个涉及触发器的详细信息。

代码
该代码无法重复使用,因为定时触发器未提供与OnEdit相同的事件详细信息。
另外,有可能在每个触发事件之间将几行标记为“完成”,并且代码需要对它们全部进行响应。最后,每个“完成的”行都无法删除,因为它会影响该列中所有剩余行的行数。

以下代码可以完成这项工作:
发问者会很熟悉。主要的例外是保留每个行号的记录,该记录已移至“完成”。这是通过将行号压入数组来完成的。然后,在检查并移动了所有数据之后,有一个小循环,该循环获取记录在阵列中的行号并删除相关行。循环从最高的行号到最低的行号工作;这样一来,删除一行不会影响要删除的任何剩余行的行号。


function so_53305432() {

    // set up the spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();

    // identify source and target sheets
    var sourceSheet = ss.getSheetByName("Sheet1");
    var targetSheet = ss.getSheetByName("Finished");

    // get some variables to use as ranges
    var sourcelastRow = sourceSheet.getLastRow();
    var numColumns = sourceSheet.getLastColumn();
    var targetLastRow  = targetSheet.getLastRow();

    // get data from the Source sheet
    var sourceData = sourceSheet.getRange(1, 1, sourcelastRow, numColumns).getValues();

    // set up some variables
    var finishedRows = [];
    var i = 0;
    var x = 0;
    var temp = 0;


    // loop through column 15 (O) checking for value = "Finished"
    for (i = 0; i < sourcelastRow; i++) {

        // If value = Finished
        if (sourceData[i][14] == "Finished") {

            // define the target range and move the source row
            var targetLastRow  = targetSheet.getLastRow();
            var target = targetSheet.getRange(targetLastRow + 1, 1);
            sourceSheet.getRange(+i + 1, 1, 1, numColumns).moveTo(target);

            // keep track of the source row number.
            finishedRows.push(i);
        }
    }

    // set up variables for loop though the rows to be deleted
    var finishedLength = finishedRows.length;
    var startcount = finishedLength - 1

    // loop throught the array to delete rows; start with the highest row# first
    for (x = startcount; x > -1; x--) {
        // get the row number for the script
        temp = +finishedRows[x] + 1;
        // delete the row
        sourceSheet.deleteRow(temp);
    }

}

触发
触发条件需要修改。为此:
1)打开脚本编辑器,选择“当前项目触发器”。 OnEdit应该显示为事件类型为OnEdit的现有触发器。
2)将“选择要运行的功能”更改为新功能,
3)将“选择事件源”从电子表格更改为“时间驱动”。
4)选择“基于时间的触发器类型” =“分钟计时器”。
5)选择“选择分钟间隔” =,然后选择一个时间段和间隔。
6)保存触发器,然后关闭“触发器”选项卡

如果发现“每分钟”太频繁,则发问者可以尝试“每5分钟”。


Trigger before


Trigger after