【发布时间】:2019-07-10 23:26:50
【问题描述】:
我被要求创建一个实时的 Google 表格电子表格来跟踪我们院子里的工作时间表。我没有使用脚本的经验,但发现我可以对工作表进行编程而不是隐藏公式,这样会产生更清晰的结果。我已经能够使工作表自行组织,并且能够手动将其归档(onEdit)。我正在寻找的是让它在凌晨 1 点自动运行代码,这样当我们上班时,它会根据某个列中的单元格值进行存档。
这是我的 onEdit 脚本的一个示例,但当有人试图检查“是”列时,会出现一些滞后,并可能导致检查错误的单元格,然后我手动更正。
function onEdit() {
var sheetNameToWatch = "Schedule";
var columnNumberToWatch = 28;
var valueToWatch = "Yes";
var sheetNameToMoveTheRowTo = "Archive";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();
if (sheet.getName() == sheetNameToWatch && 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());
}
}
所以这段代码以 100% 的失败运行,但保存并执行,老实说,我不知道为什么。可能是我误解了我需要在“功能”区域之后插入的值。我确实使用“自动存档”触发器进行了此设置,该触发器在工作表上创建了一个带有“运行”选项的菜单按钮,但是当您单击它时,它只会在第 28 列中使用“是”的最后一行(每次按下按钮将移动 1 行,直到所有行都被移动),并且该按钮不适用于工作表的其他用户。
function createTrigger() {
ScriptApp.newTrigger("Move Archive") //Move Archive is the name of the script
.timeBased()
.everyMinutes(1) // only set to 1 minute for testing, I can change this out for a daily timer
.create();
}
function myFunction() {
var sheetNameToWatch = "Schedule"; // "schedule" is the sheet we enter info on
var columnNumberToWatch = 28; //Column is "AB"
var valueToWatch = "Yes";
var sheetNameToMoveTheRowTo = "Archive"; //"Archive is the sheet the info is sent to"
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();
if (sheet.getName() == sheetNameToWatch && 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); // I get its programmed for last row with "Yes" here, unsure on how to change this.
sheet.deleteRow(range.getRow());
function myfunction() {
ScriptApp.deleteTrigger("Move Archive"); // could have wrong value here
}
}
}
我想要的只是根据第 28 列 (AB) 中的“是”值“存档”的工作表。我希望具有该列值的每一行在凌晨 1 点自动存档。任何帮助表示赞赏。如果有人甚至想为初学者推荐一本书或数字指令,那就太好了。
【问题讨论】:
-
感谢您澄清这一点,很高兴我被允许在这里发帖。为了弄清楚如何安装触发器,我可以做到这一点,我相信我的问题是知道如何填写触发器中的值以实现我正在寻找的结果。我阅读了您链接的内容,但它没有解释我必须添加到触发器中的括号以使其与我的脚本交互的值。我的另一个问题是,一旦触发器工作,它可能只会拉出符合条件的最后一行,我希望它拉出符合条件的所有行。我相信我需要一个循环或不同的脚本。
-
文档说
newTrigger将函数名称作为参数,所以在你的情况下,如果你有function myFunction(){,它将是.newTrigger('myFunction') -
好的,这是有道理的。我也确实尝试过这种方式,但床单上什么也没发生。不过,我确实看到在项目页面上创建并删除了触发器。
-
如果您的工作表或代码中有任何敏感信息,请务必将其删除,但能否提供指向工作表副本的链接?如果没有可查看的结构,可能很难可视化电子表格
-
在问题中添加了链接。
标签: google-apps-script google-sheets triggers archive schedule