Google скрипт обнаруживает пустую ячейку после редактирования - Take 2 - PullRequest
1 голос
/ 21 октября 2019

Это связано с функциональностью onEdit и вопросом с таким же названием , найденным здесь .

Я не получаю ответы, которые они указывают, я мог бы или должен, когда ячейки переходят от значений к пустым, и в результате этого обходные решения не работали. Это как если бы что-то изменилось с тех пор, как были даны эти ответы, или другое поведение.

Вот ссылка на электронную таблицу с простым примером.

В этом примере у меня есть ячейка с проверкой данных на ней. В контексте эта ячейка позволяет мне выбирать идентификаторы торговых билетов из списка, чтобы вызывать данные. После того, как я вспомнил данные, если я удалю значение из ячейки выбора с помощью возврата или удаления, должна быть вызвана функция onEdit, должно существовать ложное значение для «e.value», и я смогу очистить полученные данные,Довольно просто

== Полная проверка Protocal ==

1) Когда ячейка пуста и я выбираю значение из списка, я проверяю свойство e.value на истинность, я получаю правдивый ответ,и он завершает функцию для получения данных.

2) Когда ячейка НЕ ​​пуста, и я выбираю значение из списка, я проверяю свойство e.value для truey, я получаю ответ truey, и он завершает функцию для получения данных.

3) Когда ячейка НЕ ​​пуста, и я щелкаю в ячейке и выбираю backspace или delete, чтобы очистить ячейку. Я проверяю свойство e.value на истинность и вместо того, чтобы получить ложный ответ, я получаю объект обратно ?! {Old_value = XXXX}.

Итак, я не только не получаю ложное значение, но и возвращаю объект, в котором отсутствует элемент значения ??

Глядя на другой пост, кажется, что при отсутствии «значения» Google решил оставить элемент «значение» вне объекта e вместо того, чтобы оставить элемент «значение» в объекте e иустановив его на ноль или пустой.

Я не знаю, почему это было выбрано, но я так это интерпретирую. Тем не менее, мне кажется, что решение не должно было иметь значения.

Если я проверяю предмет в объекте, а предмет не существует, я должен получить какую-то ложную информацию, но вместо этого мне возвращают объект?!

Единственный способ, который я знаю об этом, может обойти это - проверить тип переменной, чтобы увидеть, был ли возвращен объект, который действительно ужасно запутывает новичков в программировании и не должен быть обязательным. Я попробую это в ближайшее время, но сначала хотел это выяснить.

Я помню, что сталкивался с этим несколько лет назад и не нашел времени, чтобы попытаться получить здравый ответ.

function onEdit(e){
  Logger.log("onEdit running")
  var ss =        SpreadsheetApp.getActiveSpreadsheet();  

  if (ss.getRangeByName("sTkt_uniqueID_recall").getA1Notation() == e.range.getA1Notation() ){
    Logger.log("onEdit - sTkt_uniqueID_recall")

    if(e.value){
      Logger.log("recall ID cell has value - get Data")
      Logger.log(e.value)
      //sTkt_getRecallData() 

    }else{  
      //oE.value should be blank, null or something falsy.. 
      //instead an object is returned?! {old_value: xxxxxx} 
      // and thus is not null and thus it never gets here..
      Logger.log("recall ID cell now empty - clear Data")      
      Logger.log(e.value)
      //sTkt_clearForm()
    }
    Logger.log("onEdit fxnComplete")   
  }
}

Спасибо за помощь в этом.

РЕДАКТИРОВАТЬ: Добавлены журналы.

Регистрируется, когда элемент находится в ячейке ...

[19-10-20 15:17:18:071 PDT] onEdit running
[19-10-20 15:17:18:159 PDT] onEdit - sTkt_uniqueID_recall
[19-10-20 15:17:18:160 PDT] recall ID cell has value - get Data
[19-10-20 15:17:18:160 PDT] 1002
[19-10-20 15:17:18:161 PDT] onEdit fxnComplete 

Регистрируется, когда элемент был удален - он принимает неверный путь к объекту со старым значением в нем ...

[19-10-20 15:15:25:411 PDT] onEdit running
[19-10-20 15:15:25:509 PDT] onEdit - sTkt_uniqueID_recall
[19-10-20 15:15:25:510 PDT] recall ID cell has value - get Data
[19-10-20 15:15:25:511 PDT] {oldValue=1001.0}
[19-10-20 15:15:25:511 PDT] onEdit fxnComplete

РЕДАКТИРОВАТЬ: Предоставление полного объекта события показывает это ясно. Должен был сделать это раньше. Как вы можете видеть, здесь есть старое значение, но есть объект, возвращаемый для «значения» вместо ложного (пустое или что-то еще) ...

[19-10-20 15:54:19:750 PDT] {authMode=LIMITED, range=Range, source=Spreadsheet, oldValue=10/3/2019--6939, user=xxx@xxxxacupuncture.com, value={oldValue=10/3/2019--6939}}

РЕДАКТИРОВАТЬ: я проверилОбойти это, и это то, что я, скорее всего, буду использовать, так как оно напоминает мне о том, что именно происходит, и я думаю, что если проблема будет устранена или исправлена, это обойти все равно должно работать, и мне не нужно вносить какие-либо изменения вместа, в которые он может войти.

if(e.value && typeof e.value !== 'object')

1 Ответ

1 голос
/ 22 октября 2019
  • В вашей ситуации при использовании вашей общей электронной таблицы, когда вы удаляете значение из ячейки "C4" проверки данных с помощью кнопки удаления, объект события e из onEdit(e) имеет "value":{"oldValue":"deleted value"},
    • Вы хотите знать об этой ситуации.

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

Когда я проверилВ вашей ситуации я заметил, что граница ячейки под простым триггером связана с этой ситуацией.

Подготовка 1:

Для объяснения это предполагает следующее.

  1. Создание новой электронной таблицы.
  2. Поместите текст sample в ячейку "A1".
  3. Установите простой триггер триггера события OnEdit в качестве сценария function onEdit(e) {Logger.log(JSON.stringify(e))}.
    • По объяснению, e объекта события используется, когда сработал триггер события OnEdit.

Примеры ситуаций 1:

Ситуация 1A:

Когда значение sample ячейки «A1» удаляется кнопкой удаления, e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"user":{"nickname":"","email":""}}
Ситуация 1B:

Когда текст sample в ячейке «A1» удаляется путем удаления каждого символа с помощью клавиши возврата, e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"oldValue":"sample","user":{"nickname":"","email":""},"value":{"oldValue":"sample"}}

Примеры ситуаций 2:

Здесь, чтобы повторить ситуацию, установите границу для ячейки "A1".

Ситуация 2A:

Когда значение sample ячейки«A1», который был окружен границей, удаляется кнопкой удаления, e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"oldValue":"sample","user":{"nickname":"","email":""},"value":{"oldValue":"sample"}}
Ситуация 2B:

Когда текст sample вячейка «А1», которая была окружена границей, удаляется путем удаления каждого символаПри использовании клавиши возврата назад e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"oldValue":"sample","user":{"nickname":"","email":""},"value":{"oldValue":"sample"}}

Подготовка 2:

Для пояснения это предполагает следующее.

  1. Создание новой электронной таблицы.
  2. Поместите текст sample в ячейку "A1".
  3. Скопируйте и вставьте скрипт function InstallOnEdit(e) {Logger.log(JSON.stringify(e))}.
    • В пояснении, e объекта события используется при срабатывании триггера события OnEdit.
  4. Установите для устанавливаемого триггера события OnEdit значениефункция InstallOnEdit.

Примеры ситуаций 1:

Ситуация 1A:

Когда значение sample ячейки "A1" удаляется удалениемКнопка e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"triggerUid":"###","user":{"nickname":"###","email":"###@gmail.com"}}
Ситуация 1B:

Когда текст sample в ячейке «A1» удаляется путем удаления каждого символа с помощью клавиши возврата назад,e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"oldValue":"sample","triggerUid":"###","user":{"nickname":"###","email":"###@gmail.com"}}

Примеры ситуаций 2:

Здесь, чтобы повторить ситуацию, установите границу для ячейки«A1».

Ситуация 2A:

Когда значение sample ячейки «A1», которая была окружена границей, удаляется кнопкой удаления e событияобъект возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"oldValue":"sample","triggerUid":"###","user":{"nickname":"###","email":"###@gmail.com"}}
Ситуация 2B:

Когда текст sample в ячейке «A1», которая была окружена границей, удаляется путем удаления каждого символа с помощью клавиши возврата, e объекта события возвращает следующее значение.

{"authMode":{},"range":{"columnStart":1,"rowStart":1,"rowEnd":1,"columnEnd":1},"source":{},"oldValue":"sample","triggerUid":"###","user":{"nickname":"###","email":"###@gmail.com"}}

Results andобсуждение:

Из вышеприведенного эксперимента можно получить следующие результаты.

  1. Значения объекта события зависят от ситуации с границей ячейки и без нее.
    • Также вышеуказанную ситуацию можно увидеть не только на границе, но и в тех случаях, когда цвет фона ячейки, формат (цвет шрифта, размер, полужирный и т. Д.) Исключают формат шрифта по умолчанию.
    • Похоже, что при изменении ячейки и шрифта по умолчанию, объект события возвращает значения «Примеры ситуаций 2».
  2. Значения объекта события также зависят от использования устанавливаемого триггера события и без него.

  3. В случае ячейки с ячейкой по умолчанию и шрифтом в простой триггер ,

    • Когда значение sample ячейки "A1" удаляется кнопкой удаления, e объекта события не имеет обоих oldValueи value.
    • Когда текст sample в ячейке «A1» удаляется путем удаления каждого символа с помощью клавиши возврата, e объекта события имеет как oldValue, так и value. И value равно {"oldValue":"deleted value"}.
  4. В случае ячейки с границей под простой триггер ,

    • Когда значение sample ячейки «А1» удаляется кнопкой удаления, а также текст sample в ячейке «А1» удаляется путем удаления каждого символа с помощью клавиши возврата, eобъекта события имеет как oldValue, так и value. И value равно {"oldValue":"deleted value"}.
  5. В случае ячейки с ячейкой по умолчанию и шрифтом в устанавливаемый триггер ,

    • Когда значение sample ячейки "A1" удаляется кнопкой удаления, e объекта события не имеет ни oldValue, ни value.
    • Когда текст sample в ячейке «A1» удаляется путем удаления каждого символа с помощью клавиши возврата, e объекта события имеет oldValue, а value нет. И oldValue - это удаленное значение, которое не является объектом.
  6. В случае ячейки с рамкой под устанавливаемый триггер ,
    • Когда значение sample ячейки «А1» удаляется кнопкой удаления, а также текст sample в ячейке «А1» удаляется путем удаления каждого символа с помощью клавиши возврата, e изобъект события имеет oldValue и value. И oldValue - это удаленное значение, которое не является объектом.

Из результатов, приведенных выше, я подумал, что значения (не * oldValue и value)Объект события из условия ячейки и шрифта по умолчанию может быть ошибкой или спецификацией. Но я искал официальный документ об этом. К сожалению, я все еще не смог найти его.

О вашей ситуации:

Используя приведенные выше результаты, когда ваша общая электронная таблица была протестирована, ячейка "C4" окружена границей. И простой триггер используется. Таким образом, ситуация такая же, как в приведенных выше «Типовых ситуациях 2» «Подготовка 1». Таким образом, когда значение ячейки «C4» удаляется кнопкой удаления, возвращается "value":{"oldValue":"deleted value"}.

В этом случае, как насчет следующего метода?

  1. Когдавы хотите использовать простой триггер, я думаю, что можно использовать скрипт в нижней части вашего вопроса.
  2. Когда вы можете использовать устанавливаемый триггер события OnEdit, вы можете узнать, было ли значение удалено, проверив с помощьюи без value в объекте события e.

Ссылки:

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