Google脚本:使用IMPORTDATA公式更新单个单元格

时间:2019-06-27 05:49:43

标签: google-apps-script google-sheets

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

经过大量研究,我找到了this suggestion in a previous post,但是我并没有取得多大成功。

这是我修改工作表/标签名称为“ 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)
}

这对我来说一定是“操作员错误”,我是新来的。

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

  • 您要在每个特定的时间间隔更新单元格“ 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);
}

安装时间驱动触发器:

为了安装时间驱动的触发器,you can manually install it

还可以使用脚本进行安装。以下脚本为forceEval的功能安装时间驱动的触发器。在此示例脚本中,运行setTrigger()时,每10分钟运行一次forceEval()的功能。这样,单元格“ 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();
}

参考:

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