У меня есть журнал изменений в электронной таблице, чтобы отслеживать информацию, которая добавляется, редактируется или удаляется. Проблема в том, что журнал изменений не может обнаружить, если пользователь «Удалить строку». Возможно ли вообще удалить строку журнала изменений или мне не повезло? Спасибо 🙏.
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]]);
}
}
Привет @Tanaike, я спрашиваю, есть ли способ отслеживать удаленную строку в журнале изменений. Или это невозможно?
Спасибо за ответ. Из вашего ответа я предложил ответ. Пожалуйста, подтвердите это. Если это было не полезно, прошу прощения.
Что касается 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 Спасибо за ответ. Из 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?
я уже упоминал об этом в своем ответе. Если ваш этот запрос будет выполнен, сценарий станет сложным. Если вам нужен ответ, я бы рекомендовал опубликовать его как новый вопрос. Если вы можете сотрудничать, чтобы решить ваш новый вопрос, я рад. Можете ли вы сотрудничать, чтобы сделать это?
@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?
, в этом случае, как простой способ, как насчет проверки номеров строк, добавив столбец шаблона, включающий номера строк? Таким образом, при удалении строки ее можно найти по номеру удаленной строки. Но я не могу узнать ваш фактический ожидаемый результат из вашего ответа, если это было бесполезно, приношу свои извинения.
Спасибо за идею, воспользуюсь. Я видел один баг. Иногда, когда я удаляю, журнал изменений будет отслеживать его как «EDIT», но затем «FORMAT» перезапишет его. В видео вы можете видеть, что я набрал «b» и удалил «b», но это не отображается в журнале изменений. Я попытался использовать Utilities.sleep(1000); но это не сработало. Вы случайно не представляете? Видеодоказательство: youtu.be/JsyslZnxPzs
Я думаю, что решил свою проблему! pastebin.com/KDTD20Tw
@Kay Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. К сожалению, из вашего ответа я не могу понять вашу текущую ситуацию. Ваши вопросы были решены. Правильно ли я понимаю? Могу я спросить вас о деталях вашей текущей ситуации?
В вашем скрипте обнаружена 1 ошибка. Ошибка заключалась в том, что иногда функция вызывалась дважды, что было причиной того, что журнал изменений перезаписывал информацию. Я исправил ошибку в строке 25 (pastebin.com/KDTD20Tw). Вы можете увидеть ошибку здесь: youtu.be/JsyslZnxPzs
@Kay Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять вашу нынешнюю ситуацию. 1. Что такое changelog_script
? Вы не хотите использовать триггер OnEdit? 2. Я не могу повторить вашу ситуацию. Можете ли вы предоставить подробный алгоритм правильного воспроизведения вашей текущей ситуации? Этим я хотел бы подтвердить это. Кажется, вы изменили предложенный мной сценарий. Под этим я не могу понять вашу нынешнюю ситуацию. Прошу прощения, что вы изменили предложенный мной сценарий.
@Kay Хотя, к сожалению, я до сих пор не могу понять changelog_script
, например, в вашей ситуации кажется, что вы хотите обнаружить удаление строки. В таком случае, как насчет замены changelog_script(e);
на if (e.changeType == "REMOVE_ROW") changelog_script(e);
? Таким образом, только когда строка удалена, запускается changelog_script(e)
. Как насчет этого?
@Kay И, хотя я не уверен в вашей реальной ситуации из вашего вопроса и ответа, в вашей ситуации, если несколько пользователей используют электронную таблицу, LockService также может быть полезен. Реф Но сейчас я обязан правильно знать вашу текущую ситуацию. Если вы можете сотрудничать, чтобы решить ваш вопрос, я рад.
Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять
Is it even possible to have the changelog track deleted row or am I out of luck?
. Могу я спросить вас о деталях этого?