Как заставить объект события onEdit () e работать при копировании и вставке значений в пустые или непустые ячейки в Google Sheets? - PullRequest
1 голос
/ 04 июня 2019

После моего последнего поста здесь Как удалить значение ячейки, ранее установленное объектом события (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 за полезное наблюдение!

1 Ответ

1 голос
/ 07 июня 2019
  • Ваша цель состоит в том, чтобы, когда значение буфера обмена вставлялось непосредственно в ячейку, вы хотите выполнить сценарий с помощью триггера события OnEdit.
  • Действие вставки заключается в том, что значение вставляется непосредственно в ячейку с помощью действия копирования и вставки. Это не та ситуация, когда значение помещается в ячейку при редактировании ячейки.
  • Вы хотите поместить порядковый номер в столбец «A» с той же строкой, когда выполняются следующие события.
    • Значение буфера обмена вставляется непосредственно в ячейку столбца «B».
    • Пустая ячейка столбца "B" редактируется вручную.

Если мое понимание верно, как насчет этого ответа?

Обход:

Когда значение буфера обмена вставляется в ячейку, e.value и e.oldValue из e объекта события OnEdit становятся null. В этом случае значения совпадают с ситуацией, когда значение ячейки со значением удаляется. Но есть одно другое значение ячейки. Дело в том, имеет ли ячейка значение. В этом случае это можно использовать.

Перед использованием следующих примеров сценариев установите триггер OnEdit для функции sampleEvent() в качестве устанавливаемого триггера.

Образец 1:

Это пример сценария для запуска 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, null и "### pasted value ###" соответственно.

Образец 2:

Если вы хотите разделить скрипт по следующим ситуациям, как насчет этого примера скрипта?

Ситуация:

  • Пустая ячейка была отредактирована.
  • Ячейка со значением была перезаписана значением.
  • Значение ячейки со значением было удалено.
  • Значение буфера обмена было непосредственно вставлено в ячейку.

Сценарий:

В этом примере сценария, когда срабатывает триггер события OnEdit, открывается диалоговое окно.

function sampleEvent(e) {
  var prompt = "";
  var cellValue = e.range.getValue();
  if ((e.value != null) && (e.oldValue == null)) { // When the empty cell is edited, this becomes true.
    prompt = "Empty cell was edited.";

  } else if(e.oldValue != undefined) { // When the cell with a value is overwritten by a value, this becomes true.
    prompt = "Cell with a value was overwritten by a value.";

  } else if((e.value == null) && (e.oldValue == null) && (cellValue == "")) { // When the value of cell with a value is removed, this becomes true.
    prompt = "Value of cell with a value was removed.";

  } else if((e.value == null) && (e.oldValue == null) && (cellValue != "")) { // When the value of the clipboard is directly pasted to a cell, this becomes true.
    prompt = "Value of the clipboard was directly pasted to a cell.";
  }

  SpreadsheetApp.getUi().alert(prompt);
}

Образец 3:

Если вы хотите поместить порядковый номер в столбец «A», когда значение буфера обмена вставляется непосредственно в ячейку столбца «B», как насчет этого примера сценария? Я думаю, что этот пример сценария может быть близок к вашей цели.

Сценарий:

function sampleEvent(e) {
  var prompt = "";
  var cellValue = e.range.getValue();
  if ((e.value != null) && (e.oldValue == null)) { // When the empty cell is edited, this becomes true.
    prompt = "Empty cell was edited.";
    putOrdinalNumber(e); // Put the Ordinal Number

  } else if(e.oldValue != undefined) { // When the cell with a value is overwritten by a value, this becomes true.
    prompt = "Cell with a value was overwritten by a value.";

  } else if((e.value == null) && (e.oldValue == null) && (cellValue == "")) { // When the value of cell with a value is removed, this becomes true.
    prompt = "Value of cell with a value was removed.";

  } else if((e.value == null) && (e.oldValue == null) && (cellValue != "")) { // When the value of the clipboard is directly pasted to a cell, this becomes true.
    prompt = "Value of the clipboard was directly pasted to a cell.";
    putOrdinalNumber(e); // Put the Ordinal Number

  }

  SpreadsheetApp.getUi().alert(prompt);
}

function putOrdinalNumber(e) {
  var range = e.range;
  var sheet = range.getSheet();
  if (range.getColumn() == 2 && sheet.getName() == 'Sheet1' && range.getRow() != 1 && range.offset(0, -1).getValue() == "") {
    var n = sheet.getRange("A2:A" + sheet.getLastRow()).getValues().filter(function(e) {return e[0] > 0}).length;
    range.offset(0, -1).setValue(n + 1);
  }
}
  • В этом примере сценария только когда значение буфера обмена вставляется непосредственно в ячейку столбца «B», порядковый номер помещается в столбец «A» с той же строкой.
    • Диалог открывается для каждого события.
  • Если вы хотите добавить порядковый номер к другому событию, измените приведенный выше сценарий.

Примечание:

  • Когда скопированное пустое значение вставляется в ячейку, оно становится таким же, как в случае удаления значения ячейки со значением.
  • Я подготовил сценарий для добавления порядкового номера из вашего объяснения. Поэтому, если это не тот результат, который вам нужен, измените его.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...