如何使用其他电子表格中的App Script跟踪一个电子表格中的数据更改?

时间:2018-03-07 22:35:38

标签: google-apps-script google-sheets

我可能遇到了很大的挑战: 跟踪数据变化并记录评论'在其他电子表格中使用Apps脚本在主电子表格中制​​作。

我有一个data spreadsheet,其中包含数据集的行。 对于此主页中的每个数据行,存在另一个历史记录表(例如history – First name spreadsheet)。这些历史记录应该(1)跟踪数据变化和(2)记录评论'对应的行。

例如

(1)如果有人更改data spreadsheet中第2行的值,应用脚本应在第2行和第3行之间的相应电子表格中插入一行(在本例中为history – First name spreadsheet)(&# 39; s总是在这两行之间)并添加第4,6或7行中的信息。

(2)如果有人输入评论'在F列的其中一行中的data spreadsheet中,App Script再次应在第2行和第3行之间的相应电子表格中插入一行,并在history – First name spreadsheet中添加第3行或第5行中的注释。最后但并非最不重要的是删除数据电子表格中的评论。

我搜索了很多,但没有找到任何有用的东西。 不幸的是,我不是程序员。 任何帮助将不胜感激!

祝福, 亚历

1 个答案:

答案 0 :(得分:0)

我在Apps脚本中使用onEdit()事件做了类似的事情。您可以更改它以添加用户注释,然后再附加到另一个工作表。

function appendLine() {
    var sessionEmail = Session.getActiveUser().getEmail().toString();
    var spreadsheetTimeZone = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
    var lastUpdatedString = Utilities.formatDate(new Date(), spreadsheetTimeZone, "MM/dd/yyyy' 'HH:mm:ss");

    var s = SpreadsheetApp.getActiveSheet();

    if (s.getName() == "Workload") { //checks that we're on the correct sheet
        var r = s.getActiveCell();
        if (r.getColumn() == 14) { //checks the column
            var status = r.getValue();
            var note = r.offset(0, -1);
            var noteValue = note.getValue()
            var delivery = r.offset(0, -5);
            var deliveryValue = delivery.getValue().toString();
        }

        // Validating fields are filled in
        if (status == "Complete") {
            var ui = SpreadsheetApp.getUi();
            if (noteValue == '') { // if no note is entered, stop script with message box
                var noStatus = ui.alert(
                    'Warning!',
                    'Please enter notation before choosing Complete.',
                    ui.ButtonSet.OK);
                r.setValue('')
                return;
            }

            // get array values
            var array = [lastUpdatedString, sessionEmail, deliveryValue, noteValue]          

            // insert at row 2 of destination, so newest note is always at the top and found in the index(match())   
            var ss = SpreadsheetApp.getActiveSpreadsheet();
            var pasteSheet = ss.getSheetByName("Historical Notes Sheet");
            var lock = LockService.getScriptLock();
            lock.waitLock(30000);
            try {
                var index = 2;
                pasteSheet.insertRowBefore(index).getRange(index, 1, 1, array.length).setValues([array]);
                SpreadsheetApp.flush();
            } finally {
                lock.releaseLock();
            }

            // clear response row
            note.setValue('')
            r.setValue('')
        }
    }
}