我一直在使用以下脚本将“完成”列从一张纸移动到另一张纸:
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);
}
}
我试图弄清楚即使未打开或编辑工作表也要如何运行脚本。我只是不确定如何将其更改为每分钟左右使用时间触发器。
答案 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分钟”。