我如何调整这个自定义函数,以便它在工作表中的数据发生变化时更新?
How can i tweak this custom function so it updates when data in sheets changes?
使用 Google Apps 脚本我能够 select 所有 sheet 并排除我不需要的那些,但是当我更改数据时,它不会更新我的主人sheet,我在哪里用到这个功能。我怎样才能调整这个脚本以实现这一目标?
我尝试添加 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*$/, "");
}
onEdit()
函数很容易想多了。这是一个特殊函数 (a "simple" trigger),Google 仅凭它的存在就知道该做什么。只需复制、粘贴并保存此代码。下次您对 "H1" 进行编辑时,所有 H1 值都将被汇总并记录。
function onEdit(event) {
var cellA1Notation = event.range.getA1Notation();
var excluded; // Define how you want
Logger.log(SUMALLSHEETS(cellA1Notation, excluded));
}
像您这样的自定义函数根据输入参数缓存它们的输出,因为它们被假定为是确定性的。只有当这些参数发生变化时,自定义函数才会重新计算。请参阅 Apps Script documentation on custom functions,以及此处提出的其他 custom-function
个问题。
您的问题的解决方案 - 当特定范围内的值在 non-excluded sheet 上发生更改时更新总和 - 如果您只使用该函数,则它只是微不足道的。 Diego 的回答为您提供了如何在编辑给定单元格后获取其值的提示。
但是,如果您每次在多个地方使用不同参数的自定义函数,则单个 on edit
所需的案例处理将无法维护。解决方案是更改您的数据存储架构,以便将相关的原始数据存储在一个中央位置,并使用该原始数据的视图,并在需要时 post-processed。
如果您不想改变存储架构,那么您可以完全放弃自定义功能概念。您将使用包含 hard-coded 范围+名称对的脚本,然后在完成数据更新后手动调用它来更新它们。您可以添加一个菜单选项来简化此手动操作,甚至可以编写一个侧边栏来允许在无需打开脚本编辑器的情况下操作这些对。
使用 Google Apps 脚本我能够 select 所有 sheet 并排除我不需要的那些,但是当我更改数据时,它不会更新我的主人sheet,我在哪里用到这个功能。我怎样才能调整这个脚本以实现这一目标?
我尝试添加 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*$/, "");
}
onEdit()
函数很容易想多了。这是一个特殊函数 (a "simple" trigger),Google 仅凭它的存在就知道该做什么。只需复制、粘贴并保存此代码。下次您对 "H1" 进行编辑时,所有 H1 值都将被汇总并记录。
function onEdit(event) {
var cellA1Notation = event.range.getA1Notation();
var excluded; // Define how you want
Logger.log(SUMALLSHEETS(cellA1Notation, excluded));
}
像您这样的自定义函数根据输入参数缓存它们的输出,因为它们被假定为是确定性的。只有当这些参数发生变化时,自定义函数才会重新计算。请参阅 Apps Script documentation on custom functions,以及此处提出的其他 custom-function
个问题。
您的问题的解决方案 - 当特定范围内的值在 non-excluded sheet 上发生更改时更新总和 - 如果您只使用该函数,则它只是微不足道的。 Diego 的回答为您提供了如何在编辑给定单元格后获取其值的提示。
但是,如果您每次在多个地方使用不同参数的自定义函数,则单个 on edit
所需的案例处理将无法维护。解决方案是更改您的数据存储架构,以便将相关的原始数据存储在一个中央位置,并使用该原始数据的视图,并在需要时 post-processed。
如果您不想改变存储架构,那么您可以完全放弃自定义功能概念。您将使用包含 hard-coded 范围+名称对的脚本,然后在完成数据更新后手动调用它来更新它们。您可以添加一个菜单选项来简化此手动操作,甚至可以编写一个侧边栏来允许在无需打开脚本编辑器的情况下操作这些对。