我如何调整此自定义函数,以便在工作表中的数据更改时更新?

时间:2018-04-10 03:55:44

标签: google-apps-script google-sheets custom-function

使用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*$/, "");
}

2 个答案:

答案 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));
}