【问题标题】:Google Script: Updating a Single Cell with an IMPORTDATA FormulaGoogle 脚本:使用 IMPORTDATA 公式更新单个单元格
【发布时间】:2019-06-27 05:49:43
【问题描述】:

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

经过大量研究,我找到了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)
}

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

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

我们将不胜感激。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:
    • 您希望每隔特定的时间间隔更新单元格“A1”的功能。

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

    修改点:

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

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

    修改脚本一:

    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() 运行时,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();
    }
    

    参考:

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

    【讨论】:

    • Tanaike,非常感谢您的出色详细回复。我已经完全按照您发布的方式复制了您的“修改后的脚本 2”和用于安装时间驱动触发器的脚本——其中一项修改是将更新更改为每分钟。我保存了它,运行了它,并授权了它——但它没有自动更新单元格中的公式。我没有将脚本插入:“function myFunction() {}”但是,每次我手动运行脚本(使用脚本运行按钮)时,它都会更新。知道为什么这可能不起作用吗?谢谢
    • @blafarm 感谢您的回复。我带来的不便表示歉意。从您的回复中,我无法理解您目前的情况。这是因为我的技术不好。我对此深表歉意。因此,为了确认您的情况,您可以与当前脚本共享您的电子表格以复制您的问题吗?当然,请删除您的个人信息。借此,我想确认您的情况。如果您能合作解决您的问题,我很高兴。
    • @blafarm 不幸的是,在当前阶段,需要您提供更多信息才能考虑您当前的问题。因为在我的环境中,我可以确认示例脚本有效。为了想你现在的问题,能不能配合一下?如果可以,请与您当前的脚本共享您的电子表格以复制您的问题。我想确认您的问题。
    【解决方案2】:

    函数工作表(){ var sheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("工作表"); var queryString = Math.random(); var cellfunction'= {imorTrange(“ 15mdyuivjves_7xi0cbfo_lvmbavmbav_oybfgpui8”,“工作表!a2:y10000”); sheetName.getRange('A2').setValue(cellFunction); };

    【讨论】:

    • 使用触发器 Next to run 按钮 ==> 选择要运行的函数就是(工作表)==>选择应该运行的部署(保留为 Head)==>选择事件源(时间-驱动)==>选择基于时间的触发器类型(分钟计时器)==>选择分钟间隔(每分钟)比保存。之后运行选择函数(工作表)并运行一次,它将在特定单元格中更新此导入范围公式,此后触发器将继续每分钟更新此单元格。
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多