Журнал изменений Google Sheet Appscript для отслеживания удаленной строки

У меня есть журнал изменений в электронной таблице, чтобы отслеживать информацию, которая добавляется, редактируется или удаляется. Проблема в том, что журнал изменений не может обнаружить, если пользователь «Удалить строку». Возможно ли вообще удалить строку журнала изменений или мне не повезло? Спасибо 🙏.

function onEdit(e){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetNameTracker = ss.getActiveSheet().getName();
    if (sheetNameTracker !== "Changelog") {
        let sheet = ss.getSheetByName('Changelog');
        var range = e.range.getA1Notation();
        var user = e.user.getUsername();  
        var function_source = "onEdit";
        var time = new Date();
        var changeType = 'EDIT';
        console.info(user);
        var oldValue = e.oldValue;
        var newValue = e.value;
        var lastRow = sheet.getLastRow();
        sheet.getRange(lastRow+1,1,1,8).setValues([[time.toLocaleString(),function_source,changeType,sheetNameTracker,range,user,oldValue,newValue]]);
    } 
} 

Пример Google Sheet с Appscript

Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять Is it even possible to have the changelog track deleted row or am I out of luck?. Могу я спросить вас о деталях этого?

Tanaike 19.02.2023 01:30

Привет @Tanaike, я спрашиваю, есть ли способ отслеживать удаленную строку в журнале изменений. Или это невозможно?

Kay 19.02.2023 21:02

Спасибо за ответ. Из вашего ответа я предложил ответ. Пожалуйста, подтвердите это. Если это было не полезно, прошу прощения.

Tanaike 20.02.2023 01:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что касается I am asking if there is a way I can have changelog track deleted row. Or is it not possible?, на текущем этапе объект события триггера OnEdit не включает свойство changeType. Итак, в этом случае необходимо использовать устанавливаемый триггер OnChangge. Когда это отражено в вашем сценарии, как насчет следующей модификации?

Модифицированный скрипт:

После того, как вы скопируете и вставите следующий модифицированный скрипт, установите триггер OnChange в функцию onChange. Таким образом, при удалении строки значение REMOVE_ROW возвращается как e.changeType.

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNameTracker = ss.getActiveSheet().getName();
  if (sheetNameTracker !== "Changelog") {
    let sheet = ss.getSheetByName('Changelog');
    var range = e.range && e.range.getA1Notation(); // Modified
    var user = e.user.getUsername();
    var function_source = "onEdit";
    var time = new Date();
    var changeType = e.changeType || 'EDIT'; // Modified
    console.info(user);
    var oldValue = e.oldValue;
    var newValue = e.value;
    var lastRow = sheet.getLastRow();
    sheet.getRange(lastRow + 1, 1, 1, 8).setValues([
      [time.toLocaleString(), function_source, changeType, sheetNameTracker, range, user, oldValue, newValue]
    ]);
  }
}

// Please install OnChange trigger to this function.
function onChange(e) {
  if (e.changeType == "EDIT") return;
  onEdit(e);
}
  • В этом модифицированном сценарии при удалении строки onChange автоматически запускается устанавливаемым триггером onChange. И объект события отправляется на onEdit, а журнал записывается вашим скриптом.

Примечание:

  • В случае триггера OnEdit, даже если строка удалена, этот триггер не срабатывает, хотя триггер срабатывает при редактировании ячейки. С другой стороны, в случае устанавливаемого триггера OnChange триггер срабатывает как для ячейки редактирования, так и для удаления строки. В данной модификации используется эта ситуация.

  • В случае триггера OnChange на текущем этапе объект события триггера OnChange не включает объект range. Таким образом, удаленная строка неизвестна, в то время как можно обнаружить, что строка удалена. Если вы хотите узнать удаленную строку, в качестве обходного пути необходимо сравнить старый лист и новый лист до и после редактирования. Я беспокоюсь, что в этом случае сценарий может быть сложным. Итак, в этом ответе я предложил простую модификацию.

Спасибо, я проверил скрипт, и он работает! Мой единственный вопрос, который у меня есть, заключается в том, что я хочу знать, какая информация была удалена из удаленной строки. Легко ли исправить сценарий, чтобы узнать, какая информация была удалена? 🙏

Kay 20.02.2023 05:21

@Kay Спасибо за ответ. Из Thanks, I tested the script and it works! я понял, что ваша проблема решена. Насчет My only question I have is that I want to know what information was removed from the deleted row. Is it an easy fix to the script to know what info was removed? я уже упоминал об этом в своем ответе. Если ваш этот запрос будет выполнен, сценарий станет сложным. Если вам нужен ответ, я бы рекомендовал опубликовать его как новый вопрос. Если вы можете сотрудничать, чтобы решить ваш новый вопрос, я рад. Можете ли вы сотрудничать, чтобы сделать это?

Tanaike 20.02.2023 08:07

@Kay О вашем новом вопросе My only question I have is that I want to know what information was removed from the deleted row. Is it an easy fix to the script to know what info was removed?, в этом случае, как простой способ, как насчет проверки номеров строк, добавив столбец шаблона, включающий номера строк? Таким образом, при удалении строки ее можно найти по номеру удаленной строки. Но я не могу узнать ваш фактический ожидаемый результат из вашего ответа, если это было бесполезно, приношу свои извинения.

Tanaike 20.02.2023 09:48

Спасибо за идею, воспользуюсь. Я видел один баг. Иногда, когда я удаляю, журнал изменений будет отслеживать его как «EDIT», но затем «FORMAT» перезапишет его. В видео вы можете видеть, что я набрал «b» и удалил «b», но это не отображается в журнале изменений. Я попытался использовать Utilities.sleep(1000); но это не сработало. Вы случайно не представляете? Видеодоказательство: youtu.be/JsyslZnxPzs

Kay 20.02.2023 20:21

Я думаю, что решил свою проблему! pastebin.com/KDTD20Tw

Kay 21.02.2023 01:16

@Kay Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. К сожалению, из вашего ответа я не могу понять вашу текущую ситуацию. Ваши вопросы были решены. Правильно ли я понимаю? Могу я спросить вас о деталях вашей текущей ситуации?

Tanaike 21.02.2023 01:43

В вашем скрипте обнаружена 1 ошибка. Ошибка заключалась в том, что иногда функция вызывалась дважды, что было причиной того, что журнал изменений перезаписывал информацию. Я исправил ошибку в строке 25 (pastebin.com/KDTD20Tw). Вы можете увидеть ошибку здесь: youtu.be/JsyslZnxPzs

Kay 22.02.2023 03:10

@Kay Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять вашу нынешнюю ситуацию. 1. Что такое changelog_script? Вы не хотите использовать триггер OnEdit? 2. Я не могу повторить вашу ситуацию. Можете ли вы предоставить подробный алгоритм правильного воспроизведения вашей текущей ситуации? Этим я хотел бы подтвердить это. Кажется, вы изменили предложенный мной сценарий. Под этим я не могу понять вашу нынешнюю ситуацию. Прошу прощения, что вы изменили предложенный мной сценарий.

Tanaike 22.02.2023 03:17

@Kay Хотя, к сожалению, я до сих пор не могу понять changelog_script, например, в вашей ситуации кажется, что вы хотите обнаружить удаление строки. В таком случае, как насчет замены changelog_script(e); на if (e.changeType == "REMOVE_ROW") changelog_script(e);? Таким образом, только когда строка удалена, запускается changelog_script(e). Как насчет этого?

Tanaike 22.02.2023 03:38

@Kay И, хотя я не уверен в вашей реальной ситуации из вашего вопроса и ответа, в вашей ситуации, если несколько пользователей используют электронную таблицу, LockService также может быть полезен. Реф Но сейчас я обязан правильно знать вашу текущую ситуацию. Если вы можете сотрудничать, чтобы решить ваш вопрос, я рад.

Tanaike 22.02.2023 03:58

Другие вопросы по теме