【问题标题】:Google Script pulling cached data谷歌脚本提取缓存数据
【发布时间】:2022-10-24 16:58:37
【问题描述】:

我有一张每分钟从 API 中提取数据的工作表。每行都包含有关单个 NFT 的信息,这些信息显示了在给定的一天对 NFT 所做的事情。对于每一行/NFT,数据每天在不同的时间重置一次。我拥有的脚本在它重置之前存档每一行以记录在该 24 小时期间发生的事情。

问题是,脚本并不总是在我的辅助单元格中提取实时更新。最后一天我一直在记录调试,我可以看到有时它会提取实时数据,有时它会提取相同的数据长达 4 分钟。换句话说,一行的倒计时时钟可能会在第一次运行脚本时显示 10 分钟,然后在工作表中它会更改为 9 分钟,但脚本会再次拉出 10 分钟。这可能会在剩余 8 分钟和 7 分钟时再次继续,脚本仍然显示 10 分钟。最后,在 6 分钟时,脚本将再次获取实时数据并显示 6 分钟。我的脚本也以电子表格刷新开始。

我只发现一年前报告过这个类似的问题,但我没有看到它在任何地方得到解决: Script pulling old data 我同意那张海报的假设,似乎 Google Script 是从表单的缓存版本中提取的。此错误的随机性导致我的存档出现重大问题,因此我试图弄清楚是否可以强制重新读取工作表,或者是否有关于此延迟的已知信息,以便我可以说明为此,通过适当的错误处理(例如,当前辅助单元格连续标记一行要存档 4 分钟,并在存档后删除该标志,但我不确定是否需要更长的时间)

作为参考,这是有时会提取缓存数据的代码,以防我可以添加一些内容以强制重新读取(也许从单元格中添加和删除数据只是为了使其访问工作表?):

function saveHabs() {
  var dateStamp = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var habSheet = ss.getSheetByName("Harvests");
  SpreadsheetApp.flush;
  var beVals = habSheet.getRange("be2:be").getDisplayValues();
  var habs = beVals.filter(String).length;
  var dataSheet = ss.getSheetByName("New Historical");
  var aVals = dataSheet.getRange("a:a").getDisplayValues();
  var firstRow = aVals.filter(String).length+1;
  Logger.log(habs)
  var archiveDetails;
  if (habs>0){
    archiveDetails = habSheet.getRange("be2:bi"+(habs+1)).getDisplayValues();
    dataSheet.getRange(firstRow,1,habs,5).setValues(archiveDetails);
    dataSheet.getRange(firstRow,6,habs,1).setValue(dateStamp);
    dataSheet.getRange(firstRow,6,habs,1).setNumberFormat("@");    
  }
  Logger.log(archiveDetails);
  //debugging logs
  var totalCount = habSheet.getRange("BM:BM").getDisplayValues().filter(String).length;
  Logger.log(totalCount);
  var logFlags = habSheet.getRange("BM2:BP"+totalCount).getDisplayValues();
  console.log(habs+" habitats to archive, below are the flags and time remaining (ignore second column, that's only for unharvested habs)");
  console.log(logFlags);
}

这是 MRE 工作表的简化版本:https://docs.google.com/spreadsheets/d/1od2G4i2YOJleQ6Ph0ICH-XC7L-SsINF8uBEivOsicTY/edit?usp=sharing 它当前每分钟都在运行,日志应该显示相同的错误 - 也就是说,BM 列中的倒计时不会总是在每次新脚本运行时下降,而是脚本会提取剩余的缓存时间。

【问题讨论】:

  • 我真的很想在这里写出彻底的问题,但我又被否决了,很快就无法发帖了。有人可以解释一下我在这里做错了什么吗?
  • 你好,你能提供一个minimal reproducible example吗?

标签: google-apps-script


【解决方案1】:

我不肯定这是否会在所有情况下都解决问题,但我遇到了这个问题并按照你提到的那样解决了它。我将一个简单的值(在我的情况下为 dummyCell.setValue("Running"))添加到源工作表上的空白单元格。在脚本结束时,脚本将其删除。到目前为止,这导致脚本始终读取实时工作表,没有缓存。 这似乎只发生在源选项卡只被读取,从不被写入时,所以它会出现强制写入操作将工作表更新为实时版本。 希望这也能为您解决这个问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多