应用脚本超出MAXIMUM_RUNNING_TIME解决方法

时间:2018-03-08 21:48:50

标签: for-loop google-apps-script execution-time

首先,我要继续this link的旧帖子,由于是新手,我无法发表评论。

我有一种情况,用户Br. Sayan给出的那个帖子中的答案会真正改善我的电子表格Google App脚本。我正在调用Google Url Shortener API,该API将配额设置为每用户每秒1次呼叫。我已经减慢了我的脚本以适应这个配额,但是由于我需要进行大量的调用,然后我运行了MAX_RUNNING_TIME以执行App Scripts,所以我需要在超出执行时间时中断循环并且从我离开的地方继续。

以下是他的回答代码:

function runMe() {
  var startTime= (new Date()).getTime();

  //do some work here

  var scriptProperties = PropertiesService.getScriptProperties();
  var startRow= scriptProperties.getProperty('start_row');
  for(var ii = startRow; ii <= size; ii++) {
    var currTime = (new Date()).getTime();
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      scriptProperties.setProperty("start_row", ii);
      ScriptApp.newTrigger("runMe")
               .timeBased()
               .at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
               .create();
      break;
    } else {
      doSomeWork();
    }
  }

  //do some more work here

 }

我的问题:

MAX_RUNNING_TIME是一个全局变量,其值由Apps脚本设置,我可以按原样保留该引用,还是必须将其替换为等于6分钟列为Google API控制台上运行时间配额的值?

如何将我的大部分函数放在这个脚本中,以便在我的函数内运行的循环(比如var i = 0; i&lt; data.length; i ++)将与给定部分中的循环同步在上面的代码中?

澄清:当我增加1时,我需要增加1。 这会自动发生吗?我需要一个嵌套在另一个中的循环吗?我的大部分功能是在第一个'//在这里做一些工作'还是第二个'//在这里做一些工作'或者甚至可能是doSomeWork()?

@tehhowch同意了!但是,我需要如何调整我的代码取决于我需要将它放在上面的代码片段中。

这是我到目前为止所做的:

'function short() {
  var = startTime = (new Date()).getTime();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var run = 0;
  var finc = 50;
  var istart = run * finc;
  var iLen = (run + 1) * finc;
  var startRow = 2 + istart;
  var endRow = startRow + finc;
  var data = sheet.getSheetValues(startRow,2,endRow,1);
  var shortUrl = new Array();
  for (var i=istart; i < iLen; i++) {
       Utilities.sleep(1100);
       var url = UrlShortener.Url.insert({longUrl: data[i][0]});
       shortUrl.push([url.id]);
       Logger.log([url.id]);
  }
  var t = ss.setActiveSheet(ss.getSheets()[0]);
  t.getRange(startRow,4,finc,data[0].length).clearContent();
  t.getRange(startRow,4,finc,data[0].length).setValues(shortUrl);'

因此,如果我在每次后续运行后更新代码以手动将变量“run”加1,并再次手动运行代码,则可行。

我还尝试通过更新i =和i&lt;将其分解为多个函数。每个后续功能的部件,也可以工作,但需要更多的手动工作。

我还尝试使用按下按钮继续执行该功能,但没有成功,这会比其他尝试更好,但仍然需要按下按钮才能在每次运行后恢复代码。

我希望尽可能自动化这项功能。

0 个答案:

没有答案