После моего последнего поста здесь Как удалить значение ячейки, ранее установленное объектом события (e) простого триггера onEdit () в Google Sheets? Я обнаружил, что он не печатается в A2при вставке в пустую ячейку 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
);
}
// 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
Чего не хватает в коде для печати в нем порядкового значения для A2 при копировании и вставке в пустой B2?
Здесь демо с @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
}
}
Чего не хватает в коде для печати по порядковому значению в A2 при копировании и вставке в непустое B2?
Добавлено (5 июня 2019 г.):
Чтобы лучше понять проблему, сегодня я протестировал 16 подходящих onEdit
случаев при использовании e.oldValue
и e.Value
тестов с логическими операторами !==
, ==
и &&
.
Вот результаты (нумерованные в соответствии с примером Sheet2 в рисунках здесь Sheet2 (и Sheet1) :
Эти 10 комбинаций возвращают значения в столбце A при вставке в столбец B:
1.
(e.oldValue == undefined) && (e.Value == undefined)
https://i.imgur.com/JHD1mpS.gifv
2.
(e.oldValue !== undefined) && (e.Value == undefined)
https://i.imgur.com/zlCYJ1N.gifv
3.
(e.oldValue == null) && (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 == undefined) && (e.Value == null)
https://i.imgur.com/AEDWkHf.gifv
11.
(e.oldValue == null) && (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 == undefined) && (e.Value !== null)
https://i.imgur.com/clTkSRx.gifv
15.
(e.oldValue == null) && (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 комбинаций не возвращают значения в столбце A при вставке в столбец B:
5.
(e.oldValue == undefined) && (e.Value !== undefined)
https://i.imgur.com/MGL0gVk.gifv
6.
(e.oldValue !== undefined) && (e.Value !== undefined)
https://i.imgur.com/jA7dcbf.gifv
7.
(e.oldValue == null) && (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 !== undefined) && (e.Value == null)
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
Здесь сегодняшний код:
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
)
}
}
Я посмотрю завтра, какон ведет себя в сочетании с добавленным действием .clearContents()
.
Добавлено (8 июня 2019 г.):
Благодаря зоркому глазу @theMaster я понял, что мой предыдущий тests (сделано 5 июня 2019 года выше) действительно были ошибочными, потому что я использую e. V
alue вместо e. v
alue.
Здесь ниже исправленные видео моих предыдущих 16 тестов:
1.
(e.oldValue == undefined) && (e.value == undefined)
https://youtu.be/LIW0yZIrXnw
2.
(e.oldValue !== undefined) && (e.value == undefined)
https://youtu.be/hsjrDkYhbp8
3.
(e.oldValue == null) && (e.value == undefined)
https://youtu.be/VO0ooYg9vpk
4.
(e.oldValue !== null) && (e.value == undefined)
https://youtu.be/kcIsv6IpvyM
5.
(e.oldValue == undefined) && (e.value !== undefined)
https://youtu.be/RbE1nYOBKgE
6.
(e.oldValue !== undefined) && (e.value !== undefined)
https://youtu.be/dRt3z6eO2Xo
7.
(e.oldValue == null) && (e.value !== undefined)
https://youtu.be/NKR__p6zpaU
8.
(e.oldValue !== null) && (e.value !== undefined)
https://youtu.be/2E_1mCvgx04
9.
(e.oldValue == undefined) && (e.value == null)
https://youtu.be/D8LtqDvns3U
10.
(e.oldValue !== undefined) && (e.value == null)
https://youtu.be/fy3PzZ_enKg
11.
(e.oldValue == null) && (e.value == null)
https://youtu.be/fSTEoe-M7B0
12.
(e.oldValue !== null) && (e.value == null)
https://youtu.be/QnHIdjplzfI
13.
(e.oldValue == undefined) && (e.value !== null)
https://youtu.be/brHuqvE6uWM
14.
(e.oldValue !== undefined) && (e.value !== null)
https://youtu.be/qSoDa0AuE2w
15.
(e.oldValue == null) && (e.value !== null)
https://youtu.be/W2XRG2APKFU
16.
(e.oldValue !== null) && (e.value !== null)
https://youtu.be/B2qQLOfYnCQ
Результаты записаны в предыдущих листах здесь:
Sheet2
Я сообщу логический синтез результатовзавтра.
Еще раз спасибо @TheMaster за полезное наблюдение!