@user2166613 是对的,但有点短。这是如何做到的。
我展示了一个使用 after() 触发器的示例。这是一个非常有趣的用例,因为它允许将耗时的任务与 Web 应用程序调用分离,因此调用会立即返回控制并在后台完成处理。
在我的示例中,我在此运行延迟的函数中调整了工作表的列宽。
// call this function to set a time based trigger and transfer parameters
function setTimeTrigger_AdaptColumnWidths() {
var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
var wsId = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId();
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('spreadsheetId', ssId);
scriptProperties.setProperty('worksheetId', wsId);
// Delay 10 secs, but real execution time may vary up to 15 min!
ScriptApp.newTrigger('adaptColumnWidths').timeBased().after(10000).create();
}
// this function is called by the trigger
function adaptColumnWidths() {
var scriptProperties = PropertiesService.getScriptProperties();
ssId = scriptProperties.getProperty('spreadsheetId');
wsId = scriptProperties.getProperty('worksheetId');
// getSheetById() is a custom function – see below – not yet in Spreadsheet Class!
sheet = getSheetById(SpreadsheetApp.openById(ssId), wsId);
// now do what we want to do in the timeBased trigger
for (var i = 1; i <= sheet.getLastColumn(); i++){
sheet.autoResizeColumn(i);
}
}
// -----
// custom function – hopefully this will become a method of Spreadsheet Class any time soon
function getSheetById(ss, wsId) {
var sheets = ss.getSheets();
for (var i=0; i<sheets.length; i++) {
if (sheets[i].getSheetId() == wsId) return sheets[i];
}
}
请注意,您在此处存储在所有函数调用通用的数据空间中。因此,短时间内多次调用可以覆盖彼此的参数。
在我的用例中,这不是问题,因为电子表格和工作表不会改变。但不要尝试传输可能因呼叫而异的数据。
真正的执行时刻最多可以变化 15 分钟(无论您要求什么确切时间),因此有足够的空间让多个函数调用相互干扰!!!