使用Google Apps脚本我能够选择所有工作表并排除我不需要的工作表,但是当我更改数据时,我的主工作表上没有更新它,我使用此功能。我怎样才能调整这个脚本以实现这一目标?
我尝试添加onEdit()
,但我并没有弄明白。
function SUMALLSHEETS(range, excluded) {
try {
var sum = 0,
ex = (excluded) ? Trim(excluded.split()) : false;
SpreadsheetApp.getActive()
.getSheets()
.forEach(function (s) {
if (ex && ex.indexOf(s.getName()) === -1 || !ex) {
s.getRange(range)
.getValues()
.reduce(function (a, b) {
return a.concat(b);
})
.forEach(function (v) {
sum += (!isNaN(parseFloat(v) && isFinite(v))) ? v : 0;
});
};
});
return sum;
} catch (e) {
throw e.message;
}
}
function Trim(v) {
v = (v === null || typeof v == 'undefined') ? '' : v.toString();
return v.replace(/^\s\s*/, "")
.replace(/\s\s*$/, "");
}
答案 0 :(得分:2)
您的自定义函数会根据输入参数缓存其输出,因为它们被认为是确定性的。仅当这些参数更改时,自定义函数才会重新计算。请参阅Apps Script documentation on custom functions以及此处提出的其他custom-function
个问题。
您的问题的解决方案 - 在非排除工作表上更改特定范围内的值时更新总和 - 如果您只使用一次该功能,则只是微不足道。 Diego的答案为您提供了如何在编辑后获取给定单元格的值的提示。
但是,如果您每次在具有不同参数的多个位置使用自定义函数,则单个on edit
所需的案例处理将无法维护。解决方案是更改您的数据存储架构,以便将相关的原始数据存储在中央位置,并在需要时使用原始数据的视图并进行后处理。
如果您不想改变存储架构,那么您可以完全放弃自定义功能概念。您将使用具有硬编码范围+名称对的脚本,然后在完成数据更新后手动调用它以更新它们。您可以添加菜单选项以简化此手动操作,甚至可以编写允许操作这些对的侧栏,而无需打开脚本编辑器。
答案 1 :(得分:1)
很容易超越onEdit()
功能。这是一项特殊功能(a "simple" trigger),谷歌知道如何通过它的存在来做什么。只需复制,粘贴和保存此代码即可。下次编辑时,例如“H1”,所有H1值将被求和并记录。
function onEdit(event) {
var cellA1Notation = event.range.getA1Notation();
var excluded; // Define how you want
Logger.log(SUMALLSHEETS(cellA1Notation, excluded));
}