onEdit 函数更新撤消历史记录

eli*_*0tt 1 google-sheets google-apps-script

我需要在开发人员元数据中存储工作表的上次修改用户和日期。

我使用 onEdit 函数在每次编辑工作表时更新这些元数据(请参阅下面的代码)

我的问题是在撤消历史记录中考虑了元数据创建/更新。

所以用户需要按 ctrl+Z 三次才能取消...

您知道避免这种行为的方法吗?

function onEdit(e) {
  // Prevent errors if no object is passed.
  if (!e) return;

  var dateMetadata;
  var dateKey = 'lastModificationDate';
  var userMetadata;
  var userKey = 'lastModificationUser';

  // Get the active sheet.
  var sheet = e.source.getActiveSheet();
  var user = e.user.getEmail();
  var date = Math.floor(Date.now() / 1000);
  metadatas = sheet.getDeveloperMetadata();

  for each (var m in metadatas) {
    if (m.getKey() === dateKey) {
      dateMetadata = m;
    }

    if (m.getKey() === userKey) {
      userMetadata = m;
    }
  }

  if (dateMetadata) {
    dateMetadata.setValue(date);
  } else {
    sheet.addDeveloperMetadata(dateKey, date);
  }

  if (userMetadata) {
    userMetadata.setValue(user);
  } else {
    sheet.addDeveloperMetadata(userKey, user);
  }
}
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 5

  • 脚本运行后,当按下一次“ctrl+Z”时,您想要撤消放置的值。
    • 在当前脚本中,将值放入单元格后,可以通过按 3 次“ctrl+Z”来完成撤消。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案之一。

修改要点:

  • 当从外部打开电子表格并使用脚本修改电子表格时,即使按下“ctrl+Z”也无法撤消。对于你的情况,我认为可以使用这个。
    • 使用var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName)而不是var sheet = e.source.getActiveSheet().

修改后的脚本:

当你的脚本被修改后,它会变成如下所示。

从:

function onEdit(e) {
Run Code Online (Sandbox Code Playgroud)

到:

function installedOnEdit(e) {
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请为 的功能安装可安装的 OnEdit 事件触发器installedOnEdit至此,openById就可以使用了。

另外,请修改如下。

从:

var sheet = e.source.getActiveSheet();
Run Code Online (Sandbox Code Playgroud)

到:

var id = e.source.getId();
var sheetName = e.source.getActiveSheet().getSheetName();
var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 当使用可安装的 OnEdit 事件触发器时,可以通过将函数名称从 更改为onEdit来防止函数的双重运行installedOnEdit参考号
  • 不幸的是,在这种情况下,它无法使用事件对象确认是否按下了“ctrl+Z”。这样,添加的开发者元数据无法通过“ctrl+Z”取消。请小心这一点。
  • 当然,作为另一种方法,我认为您也可以根据您的情况使用 Sheets API。

参考:

如果我误解了你的问题并且这不是你想要的方向,我很抱歉。