这是我编写的一个非常简单的程序:
function () {
var app = SpreadsheetApp ;
var tableur = app.getActiveSpreadsheet() ;
var feuille = tableur.getActiveSheet();
var now = new Date();
Utilities.sleep(900000)
feuille.getRange("A1000").setValue(now);
feuille.getRange("B1000:O1000").setValue("1000000");
feuille.getRange("P1000").setValue("Prudent");
feuille.getRange("Q1000").setValue("10");
feuille.getRange("R1000").setValue("10");
feuille.getRange("S1000").setValue("NON");
}
但是,我希望代码等待15分钟才能继续。 Google的通话时间限制为5分钟,这就是为什么我阅读了很多有关此问题的信息,但找不到任何解决方案的原因。我实际上使用了
Utilities.sleep (900000)
,但是它不起作用。我恳请您向像我这样的初学者解释如何在可能的情况下如何规避限制! :)
function onEdit(e) {
var triggerTime = new Date();
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty("lastTrigger", triggerTime);
}
function doSomething() {
var scriptProperties = PropertiesService.getScriptProperties();
var lastTrigger = new Date(scriptProperties.getProperty("lastTrigger"));
var lastTriggerUnix = lastTrigger.getTime() / 1000; // using unix time for a more straightforward time comparison
var nowUnix = (new Date()).getTime() / 1000;
var FIFTEEN_MINUTES = 15 * 60;
if ((nowUnix - lastTriggerUnix) >= FIFTEEN_MINUTES) {
scriptProperties.deleteProperty("lastTrigger");
var app = SpreadsheetApp ;
var tableur = app.getActiveSpreadsheet() ;
var feuille = tableur.getSheetByName("Réponses"); // getActiveSheet() can yield unexpected results
var app = SpreadsheetApp ;
var now = new Date()
feuille.getRange("A10").setValue(now);
feuille.getRange("B10:O10").setValue("1000000");
feuille.getRange("P10").setValue("Prudent");
feuille.getRange("Q10").setValue("10");
feuille.getRange("R10").setValue("10");
feuille.getRange("S10").setValue("NON");
}
}
有什么我忘了吗?
最佳答案
给定新的信息,您希望doSomething()
脚本在上次编辑电子表格后大约15分钟后运行,这是我的修改,但使用的是相同的一般原理。
创建一个onEdit()
简单触发器,将编辑时间保存到属性服务中(这只需通过包含onEdit
函数(Google interprets automatically)即可完成)。另外,创建一个手动触发器以每5分钟左右运行一次doSomething()
功能。当该函数运行时,如果上次编辑和现在之间的差大于或等于您期望的长度,它将检查上次编辑时间并执行所需的操作。
function onEdit(e) {
var triggerTime = new Date();
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty("lastTrigger", triggerTime);
}
function doSomething() {
var scriptProperties = PropertiesService.getScriptProperties();
var lastTrigger = new Date(scriptProperties.getProperty("lastTrigger"));
var lastTriggerUnix = lastTrigger.getTime() / 1000; // using unix time for a more straightforward time comparison
var nowUnix = (new Date()).getTime() / 1000;
var FIFTEEN_MINUTES = 15 * 60;
if ((nowUnix - lastTriggerUnix) >= FIFTEEN_MINUTES) {
scriptProperties.deleteProperty("lastTrigger");
// Do what you need to do here
}
}
您应该使用Properties Service保存
now
,然后每15分钟使用Trigger运行脚本。 (第一次运行时,时间可能会稍有延迟。)function doSomething() {
var app = SpreadsheetApp ;
var tableur = app.getActiveSpreadsheet() ;
var feuille = tableur.getSheetByName("Sheet2"); // getActiveSheet() can yield unexpected results
var scriptProperties = PropertiesService.getScriptProperties();
var storedNow = scriptProperties.getProperty("now") || new Date(); // Get the stored time. If it doesn't exist, create a new one.
var now = new Date(storedNow); // The value is stored as a String in the Properties Service, so convert to Date.
feuille.getRange("A10").setValue(now);
feuille.getRange("B10:O10").setValue("1000000");
feuille.getRange("P10").setValue("Prudent");
feuille.getRange("Q10").setValue("10");
feuille.getRange("R10").setValue("10");
feuille.getRange("S10").setValue("NON");
now = new Date(); // Create a new date to be used when the function runs again
scriptProperties.setProperty("now", now); // Save the new date
}
如trigger documentation中所述,您可以从“编辑”菜单>“当前项目的触发器”创建触发器。
我每隔5分钟测试一次,并收到以下输出。当我第一次手动运行该函数时,其时间值与后续迭代不一致。
4/6/2018 10:32:15
4/6/2018 10:33:32
4/6/2018 10:38:32
4/6/2018 10:43:32
4/6/2018 10:48:32
关于javascript - 如何延迟15分钟? 5分钟限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49681209/