【问题标题】:onEdit function update undo historyonEdit 函数更新撤消历史
【发布时间】:2020-03-24 09:09:53
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:
    • 脚本运行后,按一次“ctrl+Z”时,您想撤消放置值。
      • 在您当前的脚本中,将值放入单元格后,可以通过按 3 次“ctrl+Z”来撤消。

    如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

    修改点:

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

    修改后的脚本:

    当你的脚本被修改后,变成如下。

    发件人:

    function onEdit(e) {
    

    收件人:

    function installedOnEdit(e) {
    

    在这种情况下,please install the installable OnEdit event trigger for the function of installedOnEdit. 这样,openById 就可以使用了。

    另外,请进行如下修改。

    发件人:

    var sheet = e.source.getActiveSheet();
    

    收件人:

    var id = e.source.getId();
    var sheetName = e.source.getActiveSheet().getSheetName();
    var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
    

    注意:

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

    参考资料:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • @eli0tt 感谢您的回复。很高兴您的问题得到解决。
    • 我刚刚实现了您的 To: From: stragegy 和 BAM!:现在除了在 onEdit() 触发器上更新我的工作表之外,我的用户还恢复了撤消操作的能力!谢谢!
    • @Zecas 感谢您的评论。我很高兴。也谢谢你。
    猜你喜欢
    • 2012-05-20
    • 2011-08-20
    • 1970-01-01
    • 2010-10-13
    • 2014-04-14
    • 2021-06-25
    • 2015-01-15
    • 2020-09-26
    相关资源
    最近更新 更多