如何从Google表格和应用脚本的撤消历史记录列表中删除onEdit触发器采取的操作

时间:2019-05-02 06:26:35

标签: google-apps-script google-sheets spreadsheet

在我的一张工作表中,我使用一个简单的脚本来更改每次编辑中某些单元格的边框。

有点像这样:

function onEdit(e) {
    ...
    sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
    sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "#BBDEFB", SpreadsheetApp.BorderStyle.SOLID_THICK);
  }
}

一切正常,但是,编辑完某些内容后,可以说我按CMD + Z(或CTRL + Z)撤消了我的上一个动作。实际发生的是删除了添加的边框,因为从技术上讲这是最后的操作。

对于这种性质的问题是否存在众所周知的解决方案?

编辑: 我根据第一个答案创建了一个手动触发功能。但是,Google表格的限制是每个电子表格每个用户一个触发器。因此边界仅更改了一次。我也删除了触发器,因为它是这样说的,即使那样也没有用。

此外,还有更好的方法吗?将每次编辑的边框设置为null基本上根本不可能添加自定义边框。

2 个答案:

答案 0 :(得分:2)

如果我的理解是正确的,该解决方法如何?请将此视为几种解决方法之一。

从外部修改电子表格时,即使按下CMD + Z(或CTRL + Z)键,也无法取消修改的动作。在这种解决方法中,我使用了此方法。

修改后的脚本:

在使用此脚本之前,请安装sample()的功能作为OnEdit事件触发器。这样,在编辑单元格时,sample()的功能会自动跑。您可以在here上查看如何安装触发器。

function sample(e) {
  if (e.source.getActiveSheet().getSheetName() == "Sheet1") {
    var sheet = SpreadsheetApp.openById(e.source.getId()).getSheetByName("Sheet1"); // Modified
    var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
    var rangeList = values.reduce(function(ar, e, i) {
      if (i > 0 && (values[i - 1][0] != e[0] && e[0] != "")) {
        ar.push("A" + (i + 2) + ":P" + (i + 2));
      }
      return ar;
    }, [])
    rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1, sheet.getLastColumn()).getA1Notation());
    sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
    sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK);
  }
}

注意:

  • 使用此脚本时,请将onEdit(e)的功能重命名为onEdit_sample(e)之类的其他名称。由于脚本中包含onEdit(),因此将同时运行安装为OnEdit触发器的sample()onEdit()。请注意这一点。

参考文献:

如果我误解了你的问题,我表示歉意。

编辑:

根据您的其他要求,我添加了一个示例脚本,用于为sample()的功能安装OnEdit事件触发器。

示例脚本:

var id = SpreadsheetApp.getActiveSpreadsheet().getId();
ScriptApp.newTrigger("sample").forSpreadsheet(id).onEdit().create();

答案 1 :(得分:1)

如果不需要即时更改格式,可以尝试设置基于时间的触发器programatically,每隔X分钟运行一次。

创建自定义的“工作表”菜单选项以打开或关闭此自动监视可能很有趣。