在将值复制并粘贴到Google表格中的空白单元格或非空白单元格时,如何使onEdit()事件对象起作用?

时间:2019-06-04 14:26:30

标签: google-apps-script google-sheets

在我的最后一篇文章之后How to delete a cell's value previously set by the event object (e) of the simple trigger onEdit() in Google Sheets? 我发现粘贴到空白单元格B2中时不会打印到A2中。

这又是代码:

function onEdit(e) {
  var rg = e.range,
    row = rg.rowStart,
    col = rg.columnStart,
    sht = rg.getSheet();

  //exit code
  if (col !== 2 || sht.getName() !== 'Sheet1' || row === 1) return;

  // When the empty cell is edited, this becomes true.
  if ((e.value != null) && (e.oldValue == null)){ 
  //Calculate max value and add 1
  rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
    rg
      .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
      .getValues()
      .reduce(function(acc, curr) {//get max of colA
        return Math.max(acc, Number(curr[0]));
      }, 0) + 1
  );
  }

  // When the value of cell with a value is removed, this becomes true.
  else if ((e.value == null) && (e.oldValue == null)) { 
  rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
    rg
      .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
      .getValues()
      .reduce(function(acc, curr) {//get max of colA
        return Math.max(acc, Number(curr[0]));
      }, 0)
  ).clearContent(); // If we delete cell
  }

}

我试图理解为什么在这种情况下

((e.value != null) && (e.oldValue == null))

代码在将值输入到B2中时有效,但在将值粘贴到空白B2中时无效。

如果这是负责任的区别,那么编辑/键入和编辑/粘贴之间的根本区别是什么?

这是现场演示:

https://i.imgur.com/03Uoh7F.gif

在复制并粘贴到空白B2时,要按序号打印到A2的代码中缺少什么?

以下是@TheMaster和@Tanaike的演示:

编辑(新的正确gif):

https://i.imgur.com/mFKUnTL.gif

结果相似(粘贴到非空白单元格时B2中也没有值):

function onEdit(e) {
  var rg = e.range,
    row = rg.rowStart,
    col = rg.columnStart,
    sht = rg.getSheet();

  //exit code
  if (col !== 2 || sht.getName() !== 'Sheet1' || row === 1) return;

  // When the empty cell is edited, this becomes true.
  if ((e.value != null) && (e.oldValue == null)){ 
  //Calculate max value and add 1
  rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
    rg
      .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
      .getValues()
      .reduce(function(acc, curr) {//get max of colA
        return Math.max(acc, Number(curr[0]));
      }, 0) + 1
  );
  }

//COMPLETED PIECE

  // When the cell with a value is overwritten by a value, this becomes true.
  else if(e.oldValue!=undefined) {
  //Calculate max value and add 1
  rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
    rg
      .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
      .getValues()
      .reduce(function(acc, curr) {//get max of colA
        return Math.max(acc, Number(curr[0]));
      }, 0) + 1
  );
  }

//COMPLETED PIECE


  // When the value of cell with a value is removed, this becomes true.
  else if ((e.value == null) && (e.oldValue == null)) { 
  rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
    rg
      .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
      .getValues()
      .reduce(function(acc, curr) {//get max of colA
        return Math.max(acc, Number(curr[0]));
      }, 0)
  ).clearContent(); // If we delete cell
  }

}

在将代码复制并粘贴到非空白B2时,要按序号打印到A2的代码中缺少什么?

添加了(2019年6月5日):

为了更好地理解该问题,今天,我在将onEdite.oldValue测试与逻辑运算符e.Value,{{1}一起使用时,测试了16个相关事件!== }和==

以下是结果(根据Sheet2示例在此处Sheet2 (and Sheet1)的gif中编号:

当粘贴到B列中时,这10个组合在A列中返回值:

1。

&&

https://i.imgur.com/JHD1mpS.gifv

2。

(e.oldValue == undefined) && (e.Value == undefined)

https://i.imgur.com/zlCYJ1N.gifv

3。

(e.oldValue !== undefined) && (e.Value == undefined)

https://i.imgur.com/Zp2uutV.gifv

4。

(e.oldValue == null) && (e.Value == undefined)

https://i.imgur.com/XtT1MAt.gifv

9。

(e.oldValue !== null) && (e.Value == undefined)

https://i.imgur.com/AEDWkHf.gifv

11。

(e.oldValue == undefined) && (e.Value == null)

https://i.imgur.com/5BE5vGd.gifv

12。

(e.oldValue == null) && (e.Value == null)

https://i.imgur.com/ygqfmKe.gifv

13。

(e.oldValue !== null) && (e.Value == null)

https://i.imgur.com/clTkSRx.gifv

15。

(e.oldValue == undefined) && (e.Value !== null)

https://i.imgur.com/Whc2fcW.gifv

16。

(e.oldValue == null) && (e.Value !== null)

https://i.imgur.com/R1xiI8M.gifv

与乍一看在逻辑上的期望相反,

它返回1、2、3、4、9、11、12中的值。

根据逻辑,它仅返回13、15和16中的值。

这6种组合在粘贴到B列时不返回A列中的值:

5。

(e.oldValue !== null) && (e.Value !== null)

https://i.imgur.com/MGL0gVk.gifv

6。

(e.oldValue == undefined) && (e.Value !== undefined)

https://i.imgur.com/jA7dcbf.gifv

7。

(e.oldValue !== undefined) && (e.Value !== undefined)

https://i.imgur.com/bvczvde.gifv

8。

(e.oldValue == null) && (e.Value !== undefined)

https://i.imgur.com/Ou9zuhb.gifv

10。

(e.oldValue !== null) && (e.Value !== undefined)

https://i.imgur.com/1O4jQE3.gifv

14。

(e.oldValue !== undefined) && (e.Value == null)

https://i.imgur.com/hS6baxV.gifv

与乍一看在逻辑上的期望相反,

在5、7、8、14中不返回任何值。

根据逻辑,它仅在6和10中不返回任何值。

所有图片都在这里

https://imgur.com/a/BeauVqz

今天的代码:

(e.oldValue !== undefined) && (e.Value !== null)

明天我将看到它与添加的function onEdit(e) { var rg = e.range, row = rg.rowStart, col = rg.columnStart, sht = rg.getSheet(); //exit code if (col !== 2 || sht.getName() !== 'Sheet1' || row === 1) return; // When the empty cell is edited, this becomes true. else if (EDITS HERE) { //Calculate max value and add 1 rg.offset(0, -1, 1, 1).setValue(//setvalue in colA rg .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA .getValues() .reduce(function(acc, curr) {//get max of colA return Math.max(acc, Number(curr[0])); }, 0) + 1 ) } } 动作结合后的行为。

添加了(2019年6月8日):

由于@theMaster敏锐的眼睛,我意识到我以前的测试(于2019年6月5日完成)确实存在缺陷,因为我使用了e。.clearContents() alue而不是e。V alue。

下面是我之前16项测试的更正视频:

1。

v

https://youtu.be/LIW0yZIrXnw

2。

(e.oldValue == undefined) && (e.value == undefined)

https://youtu.be/hsjrDkYhbp8

3。

(e.oldValue !== undefined) && (e.value == undefined)

https://youtu.be/VO0ooYg9vpk

4。

(e.oldValue == null) && (e.value == undefined)

https://youtu.be/kcIsv6IpvyM

5。

(e.oldValue !== null) && (e.value == undefined)

https://youtu.be/RbE1nYOBKgE

6。

(e.oldValue == undefined) && (e.value !== undefined)

https://youtu.be/dRt3z6eO2Xo

7。

(e.oldValue !== undefined) && (e.value !== undefined)

https://youtu.be/NKR__p6zpaU

8。

(e.oldValue == null) && (e.value !== undefined)

https://youtu.be/2E_1mCvgx04

9。

(e.oldValue !== null) && (e.value !== undefined)

https://youtu.be/D8LtqDvns3U

10。

(e.oldValue == undefined) && (e.value == null)

https://youtu.be/fy3PzZ_enKg

11。

(e.oldValue !== undefined) && (e.value == null)

https://youtu.be/fSTEoe-M7B0

12。

(e.oldValue == null) && (e.value == null)

https://youtu.be/QnHIdjplzfI

13。

(e.oldValue !== null) && (e.value == null)

https://youtu.be/brHuqvE6uWM

14。

(e.oldValue == undefined) && (e.value !== null)

https://youtu.be/qSoDa0AuE2w

15。

(e.oldValue !== undefined) && (e.value !== null)

https://youtu.be/W2XRG2APKFU

16。

(e.oldValue == null) && (e.value !== null)

https://youtu.be/B2qQLOfYnCQ

结果记录在前面的表格中

Sheet2

明天我将报告逻辑结果的综合。

再次感谢@TheMaster进行有益的观察!

1 个答案:

答案 0 :(得分:1)

  • 您的目标是当剪贴板的值直接粘贴到单元格时,您要通过OnEdit事件触发器执行脚本。
  • 粘贴操作是通过复制粘贴操作将值直接粘贴到单元格上。并不是在编辑单元格的情况下将值放在单元格中的情况。
  • 在执行以下事件时,要将序号放在同一行的“ A”列中。
    • 剪贴板的值直接粘贴到“ B”列的单元格中。
    • 手动编辑“ B”列的空单元格。

如果我的理解正确,那么这个答案如何?

解决方法:

将剪贴板的值粘贴到单元格时,OnEdit事件对象的e.value的{​​{1}}和e.oldValue都变为e。在这种情况下,值与删除带有值的单元格的值时的情况相同。但是有一个不同的单元格值。这是单元格是否有值。在这种情况下,可以使用它。

在使用以下示例脚本之前,请安装null功能的OnEdit触发器作为可安装触发器。

示例1:

这是当剪贴板的值直接粘贴到单元格时用于运行sampleEvent()的示例脚本。

脚本:

Logger.log()
  • 当删除具有值的单元格的值时,function sampleEvent(e) { if ((e.value == null) && (e.oldValue == null) && (e.range.getValue() != "")) { // When the value of the clipboard is directly pasted to a cell, this script is run. Logger.log("Value of the clipboard was pasted to a cell.") } } e.valuee.oldValue分别是e.range.getValue()nullnull,分别。
  • 将剪贴板的值直接粘贴到单元格时,""e.valuee.oldValue分别是e.range.getValue()null和{{1} }。

示例2:

如果要在以下情况下分隔脚本,该示例脚本如何?

情况:

  • 空单元格已编辑。
  • 具有值的单元格被一个值覆盖。
  • 已删除具有值的单元格的值。
  • 剪贴板的值被直接粘贴到单元格中。

脚本:

在此示例脚本中,触发OnEdit事件触发器时,将打开一个对话框。

null

示例3:

如果要将剪贴板的值直接粘贴到“ B”列的单元格时将“序数”放入“ A”列,该示例脚本如何?我认为该示例脚本可能接近您的目标。

脚本:

"### pasted value ###"
  • 在此示例脚本中,仅当剪贴板的值直接粘贴到“ B”列的单元格时,“序号”才被放入具有相同行的“ A”列。
    • 为每个事件打开一个对话框。
  • 如果要通过其他事件放置序号,请修改上面的脚本。

注意:

  • 将复制的空值粘贴到单元格时,与删除带有值的单元格的值时的情况相同。
  • 我准备了用于从您的解释中输入序数的脚本。因此,如果这不是您想要的结果,请对其进行修改。

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。