【问题标题】:How to reduce the latency between two script calls in Google Apps Script如何减少 Google Apps 脚本中两个脚本调用之间的延迟
【发布时间】:2020-11-16 02:26:21
【问题描述】:

在为 Google 表格自行开发的插件中,添加了一个功能,即根据表格中的选择,声音文件将从侧边栏中的 JavaScript 音频播放器播放。代码本身见here

在表中选择一条线时,在侧边栏中播放相应的声音文件。每次选择下一行时,脚本将开始运行并将声音文件加载到侧边栏中大约需要 2 秒。由于脚本的基本思想是快速收听长长的声音文件列表,因此尽可能减少等待时间至关重要。

可以访问here 的可重现示例;附加组件>“播放音频”(需要 Google 帐户)。要重现错误,必须打开工作表两次(例如在两个浏览器中)。

【问题讨论】:

  • 请在此处发布minimal reproducible example。不接受指向minimal reproducible example 的链接
  • 我猜你必须提高投票率。
  • 可以用onSelectionChange()触发器代替轮询吗?
  • @Diego 但这意味着您必须重新加载侧边栏,这很耗时。
  • @Cooper 似乎比每 2 秒轮询电子表格更适合使用 Apps 脚本。我认为考虑到这个应用程序不适合电子表格是公平的。 Peter 最好将整个交互以 HTML 形式作为侧边栏、模式或 Web 应用程序。

标签: google-apps-script google-sheets


【解决方案1】:

为了减少延迟,您可以尝试减少 poll 函数的间隔,正如 Cooper 对问题的评论所建议的那样,并更改 getRecord 函数。

投票

此时间隔为2秒。请记住,过多地减少间隔可能会导致错误,并且还可能对每日使用配额的消耗产生重要影响。见https://developers.google.com/apps-script/guides/services/quotas

获取记录

每次运行时都会多次调用 Google Apps 脚本,这些调用速度很慢,因此您应该寻找一种方法来减少 Google Apps 脚本调用的次数。为此,您可以将电子表格表数据存储在客户端代码中,并且仅在数据更改时再次读取。

注意:Properties Service 的消费者帐户每日使用配额为 50,000。

快速实现上述的一种方法是限制getRecord函数读取当前单元格并添加一个按钮以重新加载表格中的数据。


从绑定到问题中链接的演示电子表格的脚本中获取的函数。

function getRecord() {
  var scriptProperties = PropertiesService.getScriptProperties();
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var headers = data[0];
  var rowNum = sheet.getActiveCell().getRow(); // Get currently selected row
  var oldRowNum = scriptProperties.getProperty("selectedRow"); // Get previously selected row
  if(rowNum == oldRowNum) { // Check if the was a row selection change
    // Function returns the string "unchanged"
    return "unchanged";
  }
  scriptProperties.setProperty("selectedRow", rowNum); // Update row index
  if (rowNum > data.length) return [];
  var record = [];
  for (var col=0;col<headers.length;col++) {
    var cellval = data[rowNum-1][col];
    if (typeof cellval == "object") {
      cellval = Utilities.formatDate(cellval, Session.getScriptTimeZone() , "M/d/yyyy");
    }
    record.push({ heading: headers[col],cellval:cellval });
  }
  return record;
}

相关

【讨论】:

  • 我试图减少 poll 函数的间隔 - 没有效果。看来2000毫秒是最低值了。
  • @Peter 改变 getRecord 函数怎么样?
  • 还没有成功。主要是因为我还没有能力。 ;-) 只加载表的一小部分似乎是合理的。附加组件只需要一列中的值。但是,如果我不能低于 poll 函数(或一般的 Google API?)强加的 2000 毫秒,那么这可能不会加快速度吗?
  • getRecord我试图减少数据量,将其限制为仅需要的列(包含音频URL),但似乎不可能以某种方式限制getDataRange() .使用 getRange() 对我不起作用。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多