定期刷新IMPORTXML()电子表格功能

时间:2015-11-23 14:04:18

标签: google-apps-script google-sheets

我有一张包含大约30个importxml函数的大型工作表,这些函数可以从通常每天更新两次的网站获取数据。

我希望及时(每8小时)为我的Google电子表格运行importxml功能,以便将数据保存在另一张表格中。保存已经有效,但更新没有!

我在Google Spreadsheet row update读到它可能每2小时运行一次,但我不相信这是真的,因为我将它添加到我的工作表中没有任何更改或更新,当电子表格未打开时。

我如何以简单的方式“触发”Google电子表格中的importxml功能,因为我有很多importxml个功能?

3 个答案:

答案 0 :(得分:9)

我对Mogsdad的回答做了一些调整:

  • 修正了releaseLock()来电定位
  • 将更新(或添加)querystring参数添加到导入功能中的url(而不是存储,删除,等待5秒,然后恢复所有相关公式)
  • 适用于电子表格中的特定工作表
  • 显示上次更新的时间

...

function RefreshImports() {
  var lock = LockService.getScriptLock();
  if (!lock.tryLock(5000)) return;             // Wait up to 5s for previous refresh to end.

  var id = "[YOUR SPREADSHEET ID]";
  var ss = SpreadsheetApp.openById(id);
  var sheet = ss.getSheetByName("[SHEET NAME]");
  var dataRange = sheet.getDataRange();
  var formulas = dataRange.getFormulas();
  var content = "";
  var now = new Date();
  var time = now.getTime();
  var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
  var re2 = /((\?|&)(update=[0-9]*))/gi;
  var re3 = /(",)/gi;

  for (var row=0; row<formulas.length; row++) {
    for (var col=0; col<formulas[0].length; col++) {
      content = formulas[row][col];
      if (content != "") {
        var match = content.search(re);
        if (match !== -1 ) {
          // import function is used in this cell
          var updatedContent = content.toString().replace(re2,"$2update=" + time);
          if (updatedContent == content) {
            // No querystring exists yet in url
            updatedContent = content.toString().replace(re3,"?update=" + time + "$1");
          }
          // Update url in formula with querystring param
          sheet.getRange(row+1, col+1).setFormula(updatedContent);
        }
      }
    }
  }

  // Done refresh; release the lock.
  lock.releaseLock();

  // Show last updated time on sheet somewhere
  sheet.getRange(7,2).setValue("Rates were last updated at " + now.toLocaleTimeString())
}

答案 1 :(得分:3)

回答你的问题,以便轻松触发&#34;强制重新加载函数:

在您正在加载的网址中添加其他未使用的参数,同时引用一个单元格以获取该参数的值。 一旦你改变了那个单元格的内容,该函数就会重新加载。

示例:

importxml("http://www.example.com/?noop=" & $A$1,"...")

遗憾的是,您无法将日期计算功能放入引用的单元格中,这会抛出一个不允许这样做的错误。

答案 2 :(得分:0)

您还可以将每个XML公式作为注释放在相应的单元格中,并记录一个宏以将其复制并粘贴到同一单元格中。以后使用脚本,然后使用触发器功能来安排此宏。 Google Sheets Comment Google Scripts Google Triggers