当用户删除单元格内容时,如何获取单元格的oldValue?在这种情况下,e.oldValue未定义

时间:2018-11-26 06:23:31

标签: google-apps-script google-sheets

当用户删除内容时,如何获取单元格的oldValue?

这样做的目的是为了防止新用户使用共享电子表格时意外删除/编辑。只有空单元格应该在没有警告的情况下进行更新。

在编辑单元格内容时有效。 但是在删除单元格内容时,未定义oldValue-单元格具有内容。

PS。我知道这仅适用于单个单元格编辑-我检查了范围宽度/高度== 1,但是对于值删除也不是这样。 (选择单元格,然后按Delete键)

我的测试代码如下:

function onEdit(e) {
  Logger.log("onEdit called") 
  Logger.log("e.oldValue: %s", e.oldValue) 
  Logger.log("e.value: %s", e.value)
  Logger.log(e) 
  if (!("value" in e) || (e.oldValue != undefined)) {
     if (shouldRevertChange(e.oldValue, e.range.getValue())) {
        e.range.setValue(e.oldValue);
     }
   }
}

function shouldRevertChange(oldValue, newValue) {
  var ui = SpreadsheetApp.getUi();

  var result = ui.alert(
     'Was this a mistake?',
    'You changed the contents of a cell. Old value: '+oldValue+', new value: '+newValue+'. Do you want to revert the change?',
      ui.ButtonSet.YES_NO);

  // Process the user's response.
  if (result == ui.Button.YES) {
    // User clicked "Yes".
    return true;
  } else {
    // User clicked "No" or X in the title bar.
    return false;
  }
}

这是我的测试表-可编辑: https://docs.google.com/spreadsheets/d/1BP0Zqbf8QndhI62AucT3nGNm9eUlgzxf0lTCy2UHe-0/edit?usp=sharing

也测试脚本: https://script.google.com/d/1IuTpeEDlsqjDyp3ADRy2JYKzDymR7zOpPkamIcEUHnHXUNdA0SRf7xyU/edit?usp=sharing

我需要在警报消息中看到已删除单元格中的旧值。

用于编辑值的消息: User alert 从编辑值记录: enter image description here

有关删除/清除值的消息: enter image description here

用于删除/清除值的日志(旧单元格的值不存在): enter image description here

3 个答案:

答案 0 :(得分:1)

有一个插件可以为您完成此任务。它采用创建隐藏电子表格以反映真实电子表格的途径。

https://gist.github.com/tanaikech/73edaed1268a6d07118aed538aa5608d

答案 1 :(得分:1)

    function onEdit(e){
        e.range.setNote(e.oldValue);
        e.range.setValue(e.range.getNote());
        e.range.clearNote();
    }

上述功能在Google的单元格功能中使用“插入便笺” 表格作为临时保存变量。旧值的副本 将该单元格复制为注释,重置该单元格的编辑值 便笺被删除。此代码未专门检查是否 用户已点击“删除”键。它取代了对 具有e.oldValue的单元格。

要专门检查用户是否已按下“删除”键并重置 可以将e.oldValue的单元格更改为:

    function onEdit(e){
        if(e.value == null) 
        e.range.setValue(e.oldValue);
    }

注意: 通过Apps脚本保护的表格容易受到通过Google表格电话应用所做的修改的影响。在这种情况下,可能需要使用单元格公式。 Sheet1可用于接收用户输入。 Sheet2是Sheet1的镜像,并且仅由所有者锁定以进行编辑。我在Sheet2的单元格D5中使用以下公式:

    =IF(LEN(Sheet1!D5)=0,"Please enter valid input",Sheet1!D5)

用户需要检查Sheet2中基于给定输入生成的输出。

答案 2 :(得分:0)

使用“下线”获取旧值onEdit函数

var oldValue = e.oldValue ? e.oldValue : null;