在我的最后一篇文章之后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的代码中缺少什么?
为了更好地理解该问题,今天,我在将onEdit
和e.oldValue
测试与逻辑运算符e.Value
,{{1}一起使用时,测试了16个相关事件!==
}和==
。
以下是结果(根据Sheet2示例在此处Sheet2 (and Sheet1)的gif中编号:
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中的值。
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中不返回任何值。
所有图片都在这里
今天的代码:
(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
)
}
}
动作结合后的行为。
由于@theMaster敏锐的眼睛,我意识到我以前的测试(于2019年6月5日完成)确实存在缺陷,因为我使用了e。.clearContents()
alue而不是e。V
alue。
下面是我之前16项测试的更正视频:
1。
v
2。
(e.oldValue == undefined) && (e.value == undefined)
3。
(e.oldValue !== undefined) && (e.value == undefined)
4。
(e.oldValue == null) && (e.value == undefined)
5。
(e.oldValue !== null) && (e.value == undefined)
6。
(e.oldValue == undefined) && (e.value !== undefined)
7。
(e.oldValue !== undefined) && (e.value !== undefined)
8。
(e.oldValue == null) && (e.value !== undefined)
9。
(e.oldValue !== null) && (e.value !== undefined)
10。
(e.oldValue == undefined) && (e.value == null)
11。
(e.oldValue !== undefined) && (e.value == null)
12。
(e.oldValue == null) && (e.value == null)
13。
(e.oldValue !== null) && (e.value == null)
14。
(e.oldValue == undefined) && (e.value !== null)
15。
(e.oldValue !== undefined) && (e.value !== null)
16。
(e.oldValue == null) && (e.value !== null)
结果记录在前面的表格中
明天我将报告逻辑结果的综合。
再次感谢@TheMaster进行有益的观察!
答案 0 :(得分:1)
如果我的理解正确,那么这个答案如何?
将剪贴板的值粘贴到单元格时,OnEdit事件对象的e.value
的{{1}}和e.oldValue
都变为e
。在这种情况下,值与删除带有值的单元格的值时的情况相同。但是有一个不同的单元格值。这是单元格是否有值。在这种情况下,可以使用它。
在使用以下示例脚本之前,请安装null
功能的OnEdit触发器作为可安装触发器。
这是当剪贴板的值直接粘贴到单元格时用于运行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.value
和e.oldValue
分别是e.range.getValue()
,null
和null
,分别。""
,e.value
和e.oldValue
分别是e.range.getValue()
,null
和{{1} }。如果要在以下情况下分隔脚本,该示例脚本如何?
在此示例脚本中,触发OnEdit事件触发器时,将打开一个对话框。
null
如果要将剪贴板的值直接粘贴到“ B”列的单元格时将“序数”放入“ A”列,该示例脚本如何?我认为该示例脚本可能接近您的目标。
"### pasted value ###"
如果我误解了您的问题,而这不是您想要的结果,我深表歉意。