Google apps script 将lockservice和SpreadsheetApp.flush添加到脚本(谷歌应用程序脚本/谷歌工作表)

Google apps script 将lockservice和SpreadsheetApp.flush添加到脚本(谷歌应用程序脚本/谷歌工作表),google-apps-script,google-sheets,google-sheets-formula,Google Apps Script,Google Sheets,Google Sheets Formula,研究如何使脚本在IMPORTXML完成数据收集之前不继续,我发现此函数是最常用的指示之一: function testWait(){ var lock = LockService.getScriptLock(); lock.waitLock(300000); SpreadsheetApp.flush(); lock.releaseLock(); } 原始来源: 我想知道应该在哪里添加它,以及需要添加多少次,是应该在电子表格中调用IMPORTXML函数的每一行脚本下面添加它,还是应该

研究如何使脚本在IMPORTXML完成数据收集之前不继续,我发现此函数是最常用的指示之一:

function testWait(){
  var lock = LockService.getScriptLock(); lock.waitLock(300000); 
  SpreadsheetApp.flush(); lock.releaseLock();
}
原始来源:

我想知道应该在哪里添加它,以及需要添加多少次,是应该在电子表格中调用IMPORTXML函数的每一行脚本下面添加它,还是应该在脚本的开头或结尾只使用一次

如果可能,请向我展示一个修改后脚本的示例。

我的脚本示例(它要大得多,但为了避免问题太大,我将只发布一部分):


参考答案有误,建议的代码不打算在函数中多次使用,其目的是避免在同一脚本的另一次执行仍在运行时超出代码的某些部分


下面的代码减少了对GoogleApps脚本方法的调用次数,包括使用电子表格.flush()和do。。。while语句等待电子表格重新计算

注意:我没有测试这个,因为没有提供URL

函数myFunction(){
var ss=SpreadsheetApp.getActive();
//添加公式
setFormula('=IMPORTXML(Gerais!R1,“/*[@class=\'header-label\']”);
setFormula('=IMPORTXML(Gerais!R2,“/*[@class=\'header-label\']”);
setFormula('=IMPORTXML(Gerais!R3,“/*[@class=\'header-label\']”);
//强制应用上述更改
SpreadsheetApp.flush();
//给时间重新计算电子表格
var start=Date.now();
风险价值限额=10000;
做{
睡眠(1000);
var values=ss.getRange('Monster!A2:C2').getValues()[0];
}
while(values.every(value=>value=='')| | Date.now()-start
引用的答案有误,建议的代码不打算在函数中多次使用,其目的是避免在同一脚本的另一次执行仍在运行时,代码的某些部分被忽略


下面的代码减少了对Google Apps脚本方法的调用次数,包括使用电子表格.flush()和do…while语句来等待电子表格重新计算

注意:我没有测试这个,因为没有提供URL

函数myFunction(){
var ss=SpreadsheetApp.getActive();
//添加公式
setFormula('=IMPORTXML(Gerais!R1,“/*[@class=\'header-label\']”);
setFormula('=IMPORTXML(Gerais!R2,“/*[@class=\'header-label\']”);
setFormula('=IMPORTXML(Gerais!R3,“/*[@class=\'header-label\']”);
//强制应用上述更改
SpreadsheetApp.flush();
//给时间重新计算电子表格
var start=Date.now();
风险价值限额=10000;
做{
睡眠(1000);
var values=ss.getRange('Monster!A2:C2').getValues()[0];
}
while(values.every(value=>value=='')| | Date.now()-start
Lockservice锁定脚本执行-它不会锁定用户或公式对电子表格的访问 如果您希望使用的是使代码同步,以便在前一个请求完成之前不会执行请求(如设置公式或复制值)-您可以使用
SpreadsheetApp.flush()

  • 前者等待最后一次调用SpreadsheetApp完成

  • 后者为脚本提供了一些额外的时间——在正确更新Sheets公式之前等待可能很有用

  • 您需要在代码中多次使用这些请求—只要适用

样本:

函数myFunction(){
var ss=SpreadsheetApp.getActive();
setFormula('=IMPORTXML(Gerais!R1,“/*[@class=\'header-label\']”);
//根据公式导入数据所需的时间,修改等待时间
睡眠(1000);
ss.getRange('Monster!A1:A').copyTo(ss.getRange('Page 2!A1:A'),SpreadsheetApp.copypesttype.PASTE_值,false);
SpreadsheetApp.flush();
ss.getRange('Monster!A1').clear({contentsOnly:true,skipFilteredRows:true});
SpreadsheetApp.flush();
setFormula('=IMPORTXML(Gerais!R2,“/*[@class=\'header-label\']”);
睡眠(1000);
ss.getRange('Monster!B1:B').copyTo(ss.getRange('Page 2!B1:B'),SpreadsheetApp.copypesttype.PASTE_值,false);
SpreadsheetApp.flush();
ss.getRange('Monster!B1').clear({contentsOnly:true,skipFilteredRows:true});
SpreadsheetApp.flush();
setFormula('=IMPORTXML(Gerais!R3,“/*[@class=\'header-label\']”);
睡眠(1000);
ss.getRange('Monster!C1:C').copyTo(ss.getRange('Page 2!C1:C'),SpreadsheetApp.copypesttype.PASTE_值,false);
SpreadsheetApp.flush();
ss.getRange('Monster!C1').clear({contentsOnly:true,skipFilteredRows:true});
//不需要在脚本末尾刷新
}
Lockservice锁定脚本执行-它不会锁定用户或公式对电子表格的访问 如果您希望使用的是使代码同步,那么请求(如为
function myFunction() {
  var ss = SpreadsheetApp.getActive();
  ss.getRange('Monster!A1').setFormula('=IMPORTXML(Gerais!R1,"//*[@class=\'header-label\']"');
  ss.getRange('Monster!A1:A').copyTo(ss.getRange('Page 2!A1:A'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  ss.getRange('Monster!A1').clear({contentsOnly: true, skipFilteredRows: true});
  
  ss.getRange('Monster!B1').setFormula('=IMPORTXML(Gerais!R2,"//*[@class=\'header-label\']"');
  ss.getRange('Monster!B1:B').copyTo(ss.getRange('Page 2!B1:B'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  ss.getRange('Monster!B1').clear({contentsOnly: true, skipFilteredRows: true});
  
  ss.getRange('Monster!C1').setFormula('=IMPORTXML(Gerais!R3,"//*[@class=\'header-label\']"');
  ss.getRange('Monster!C1:C').copyTo(ss.getRange('Page 2!C1:C'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  ss.getRange('Monster!C1').clear({contentsOnly: true, skipFilteredRows: true});
}