首先,我要继续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;将其分解为多个函数。每个后续功能的部件,也可以工作,但需要更多的手动工作。
我还尝试使用按下按钮继续执行该功能,但没有成功,这会比其他尝试更好,但仍然需要按下按钮才能在每次运行后恢复代码。
我希望尽可能自动化这项功能。