【发布时间】:2020-06-07 19:16:18
【问题描述】:
这只是我在这里的第三篇文章。 我从来没有写过代码,我没有任何技能,我只是想学习一些概念,这样我就可以“修复”一个 Google Apps 脚本。
问题:我想了解setFormula 和setValue 的行为,以及为什么单元格值会更新。
我正在使用UrlFetchApp.fetch 从 URL 中获取一些值并在单元格中设置该值。
我正在使用 setFormula 或 setValue 写入值。
这些功能是从工作表中的菜单手动触发的(未在下面的脚本中编码)
所以我从“Url”中获取数据并将它们写在单元格上。
函数的首次运行:
如果 URL 中的数据是:“A”,那么:
--> setFormula 写“A”
--> setValue 写“A”
函数的第二次运行:
URL 中的数据已从“A”变为“B”,则:
--> setFormula 没有覆盖单元格,仍然是“A”
--> setValue用“B”覆盖“A”
我知道脚本正在按预期运行,完全没有问题。我只是想了解为什么 setFormula 从上一次运行中“知道”单元格已经被写入,因此它不会更新值。
这是解释问题的简短脚本。 网址值在工作表上设置,如您在这张图片中看到的那样,它是https://engaliao.com/html.htm
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [
{name: "Formula", functionName: "runFormula"},
{name: "SetValue", functionName: "runSet"}
];
sheet.addMenu("Menu", entries);
}
function runFormula() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
'hoja'
);
activeSheet.getRange(2, 2).setFormula('=RunCheck' + '(A2)');
}
function runSet() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
'hoja'
);
var workingCell = activeSheet.getRange(3, 1).getValue();
activeSheet.getRange(3, 2, 1, 1).setValue(RunCheck(workingCell));
}
function RunCheck(Url) {
var array = [];
var response = UrlFetchApp.fetch(Url);
if (response.getResponseCode() == 200) {
var content = JSON.parse(response.getContentText());
var score = content['loadingExperience']['id'];
}
array.push([score]);
return array;
}
不需要外部提取来解释我的问题的新简化脚本:
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [
{name: "Formula", functionName: "runFormula"},
{name: "SetValue", functionName: "runSet"}
];
sheet.addMenu("Menu", entries);
}
function runFormula() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("hoja");
activeSheet.getRange(2, 2).setFormula("=RunCheck" + "(A2)");
}
function runSet() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("hoja");
var workingCell = activeSheet.getRange(3, 1).getValue();
activeSheet.getRange(3,2,1,1).setValue(RunCheck(workingCell));
}
function RunCheck(text) {
var array = [];
var number = (Math.random())
array.push([text + " " + number]);
return array;
}
【问题讨论】:
-
如果你添加“SpreadsheetApp.flush();”你会得到同样的行为吗?到 runSet() 结束?我的猜测是公式已更新,但尚未调用该函数,因此没有更新。顺便说一句,在不知道您在“hoja”表的单元格中放入什么的情况下,很难测试代码。
-
已编辑帖子以显示实际工作表。
SpreadsheetApp.flush();没有对行为做出任何改变。这是一个用于解释我的问题的示例脚本。真正的事情是Url目标 html 文件并不总是包含相同的信息,它在变化,而且我有一个时间触发器来每小时运行这些函数。我想理解为什么setFormula不去runCheck更新值,并且单元格值从第一次触发器运行中保留,但setValues确实更新了值。为了测试代码,我应该在你的第一次和第二次运行之间更新文件 -
您真的应该将 setValue() 用于单个单元格。 setValues() 旨在编写一个二维数组。
-
谢谢@Cooper,你是对的,那是因为脚本来自一个更大的脚本,我设置了超过 1 个值。无论如何,帖子已被编辑。
-
是的,当然,setValue 和 setFormula 都可以正常工作。那不是我的问题。我的问题是为什么 setFormula 在 Url 数据更改后的第二次运行中不更新该值,但 setValue 确实更新了它。我知道这不是“问题”或错误代码,我只是想了解原因。
标签: google-apps-script google-sheets