如何延迟15分钟?限制5分钟

时间:2018-04-05 20:44:38

标签: javascript google-apps-script

这是我写的一个非常简单的程序:

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分钟。谷歌有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"); 
  }
}

我忘记了吗?

1 个答案:

答案 0 :(得分:1)

鉴于您希望{E-1}}脚本在电子表格上次编辑后大约15分钟运行的新信息,这是我的修改,但使用相同的一般原则。

创建一个doSomething()简单触发器,将编辑时间保存到属性服务(这可以通过简单地包含onEdit()函数来完成,Google interprets automatically)。另外,创建一个手动触发器,每隔5分钟左右运行一次onEdit功能。当该功能运行时,如果上次编辑和现在之间的差异大于或等于您想要的长度,它将检查上次编辑时间并执行您想要的操作。

doSomething()

您应该使用Properties Service保存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 } } ,然后使用Trigger每15分钟运行一次脚本。 (第一次运行时,时间可能稍微偏离。)

now

trigger documentation所述,您可以从“编辑”菜单>创建触发器。当前项目的触发器。 enter image description here

我在5分钟的间隔内对此进行了测试,并收到了以下输出。当我第一次手动运行该函数时,其时间值与后续迭代不一致。

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
}