首页 > 解决方案 > Google 脚本:使用 IMPORTDATA 公式更新单个单元格

问题描述

我在名为“test-r”的 Google 表格的单元格 A1 中有一个 IMPORTDATA 公式,我希望能够以特定的时间间隔更新单元格——从几秒到几小时不等。

经过大量研究后,我在上一篇文章中提出了这个建议,但我并没有取得太大的成功。

这是我在该帖子中为“test-r”的工作表/选项卡名称的单元格 A1 中的 IMPORTDATA 公式修改脚本的方式

function forceEval(sheetName, Row, Col){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("test-r");
  var orig = sheet.getRange(1,1).getFormula(); 
  var temp = orig.replace("=", "?");
  sheet.getRange(row,col).setFormula(temp); 
  SpreadsheetApp.flush();
  sheet.getRange(row,col).setFormula(orig); 
}

function onEdit(e){
    forceEval("test-r", 1, 1)
}

这必须是我的“操作员错误”,我对此并不陌生。

同时,我不知道是否有更简单的脚本来实现我的目标。

任何援助将不胜感激。

标签: google-apps-scriptgoogle-sheets

解决方案


  • 您想在每个特定的间隔时间更新单元格“A1”的功能。

如果我的理解是正确的,那么这个修改呢?

修改点:

  • 在您的脚本中,使用了 OnEdit 事件触发器。在这种情况下,当单元格被编辑时,触发器被触发。
    • 我认为这可能不适合您的情况。
    • 使用时间驱动触发器怎么样?
  • 您的脚本中有一些拼写错误。这样,变量就没有被使用,并且发生了一些错误。

当以上几点反映到您的脚本时,它变成如下。

修改脚本1:

function forceEval(){ // Modified
  var sheetName = "test-r";
  var cell = "A1";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName); // Modified
  var orig = sheet.getRange(cell).getFormula(); // Modified
  var temp = orig.replace("=", "?");
  sheet.getRange(cell).setFormula(temp); // Modified
  SpreadsheetApp.flush();
  sheet.getRange(cell).setFormula(orig); // Modified
}
  • 修改脚本后,为了执行forceEval()每个特定间隔时间的功能,请安装时间驱动触发器。
  • 在这个脚本中,#NAME?会显示一瞬间。如果您不想这样做,那么下面的示例脚本怎么样?

修改脚本2:

function forceEval(){
  var sheetName = "test-r";
  var cell = "A1";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getSheetByName(sheetName).getRange(cell);
  var formula = range.getFormula();
  range.clearContent();
  SpreadsheetApp.flush();
  range.setFormula(formula);
}

安装时间驱动触发器:

为了安装时间驱动触发器,您可以手动安装它

您也可以使用脚本安装它。以下脚本为forceEval. 在这个示例脚本中,当setTrigger()运行时,函数forceEval()每 10 分钟运行一次。这样,单元格“A1”的公式每 10 分钟更新一次。

function setTrigger() {
  var minutes = 10; // In this case, as a sample value, it's 10 minutes.
  var functionName = "forceEval";

  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == functionName && triggers[i].getTriggerSource() == ScriptApp.TriggerSource.CLOCK) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
  ScriptApp.newTrigger(functionName).timeBased().everyMinutes(minutes).create();
}

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读