google-apps-script - 如何在谷歌表格中创建函数 sleep(毫秒) 以延迟或暂停一定范围内的公式

标签 google-apps-script google-sheets sleep onpause google-sheets-formula

在谷歌表格中我有:

Range B1:B260

我有这个功能:

(ImportXML(A1;"//a/@href")
(ImportXML(A2;"//a/@href")
(ImportXML(A3;"//a/@href")
.
.
.
(ImportXML(A260;"//a/@href")

我需要延迟计算之间的时间,因为如果我同时执行此操作,我将得到 #REF!因为 API 和 =ImportXML() 的限制

每个单元计算延迟10秒就可以了

我尝试创建一个 =LEN()函数仅在字符数大于 X 时才在单元格中执行计算...但它只延迟了一小部分时间。

使用sleep(milliseconds)在谷歌脚本中我可以得到一个公式sleep(B1:B260,5000) ?延迟 ImportXML、Importdata、Import... 过程?

最佳答案

您可以使用 Utilities.sleep(milliseconds) 函数在两个单独的远程 API 调用之间进行休眠。请参阅下面的示例:

function runScraper() {
  var resultRange = SpreadsheetApp.getActive().getRange("B1:B260");
  var urlRange = SpreadsheetApp.getActive().getRange("A1:A260");
  for (var i=1; i<=urlRange.getHeight(); i++) {
    var currentValue = resultRange.getCell(i, 1).getValue();
    if (currentValue !== "") continue;

    var url = urlRange.getCell(i, 1).getValue();
    var result = scrape(url);
    resultRange.getCell(i, 1).setValue(result);
    Utilities.sleep(10000);
  }
}

至于实现 scrape(url) 功能,实现取决于您使用的 API 以及使用的数据传输格式是什么(JSON、XML...)。为此,我建议您检查以下链接:

免责声明

Google Apps 脚本的最长运行时间为 6 minutes 。如果每次调用等待 10 秒并总共发出 260 次调用,则将超出最大运行时间。为此,在上面的代码中,我实现了一项检查,该检查将验证正在处理的行尚未被刮除。如果已经被刮过,则直接进入下一个。这将使您可以轻松地重新运行脚本并从上次停止的位置(由于超时)继续。

关于google-apps-script - 如何在谷歌表格中创建函数 sleep(毫秒) 以延迟或暂停一定范围内的公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431056/

相关文章:

python-3.x - "Quota exceeded for quota group ' ReadGroup ' and limit ' 每个用户每 100 秒服务 google api 的读取请求

java - 在 Java 中检测操作系统 sleep 和唤醒事件

java - 创建一个循环之间间隔一秒的循环 [处理代码中的异常]

Java Thread.sleep(延迟)不起作用

google-sheets - 谷歌表格多个 IF(COUNTIF()) 可能在同一个公式中?

google-apps-script - Google Apps Script : In spreadsheet, 如何选择包含日期格式值的单元格并将其更改为该日期加 7 天(1 周)

google-apps-script - 是否可以使用谷歌电子表格中的数据来 'prefill' 谷歌表单?

javascript - 重置循环内的变量

javascript - 连接动态列数 Google 脚本

javascript - 使用 Google Apps 脚本删除 Gmail 电子邮件的附件