google-apps-script - 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)
}
这必须是我的“操作员错误”,我对此并不陌生。
同时,我不知道是否有更简单的脚本来实现我的目标。
任何援助将不胜感激。
解决方案
- 您想在每个特定的间隔时间更新单元格“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();
}
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
推荐阅读
- ios - 调用协议扩展中的方法而不是视图控制器中的方法实现
- opacity - 如何使用 camanjs 更改图像不透明度?
- java - java.lang.NoSuchMethodError:org.springframework.core.annotation.AnnotatedElementUtils.getAnnotationAttributes
- c# - Appium - 在重新启动应用程序的情况下最好 - LaunchApp 或 StartActivity
- android - 魅族 MX6 出现 SpeechRecognizer SecurityException
- android - 如何从 IntentService 类更新edittext?
- c# - Activator.createinstance(generic type, args) 方法抛出异常
- c# - C#字节数组转换成变量
- python - Django - queryset.union 返回损坏的查询集:filter() 和 get() 返回所有内容
- ios - 在 xcode 中构建归档后组织归档为空