onEdit Доступ объекта события к предыдущему значению измененной ячейки?

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

Спасибо за вашу помощь.

OnEdit (событие)

function onEdit(event) 
/* Default onEdit Event function */
{
  var ssa = SpreadsheetApp.getActiveSpreadsheet();
  var ss = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
...

person VanacK    schedule 16.06.2012    source источник


Ответы (2)


--edit, похоже, теперь это возможно. Просмотрите ссылки и комментарии ниже.

Подробная информация находится в документации здесь.

Но предыдущее значение недоступно для события. В отношении этого открыт запрос на улучшение . Вы должны «пометить» его, чтобы отслеживать обновления и голосовать за него.

Теперь к «обходным путям». Все они основаны на том, что вам придется сохранять исходные данные самостоятельно в другом месте. У вас может быть зеркальная электронная таблица или лист, и когда что-либо onEdit происходит с оригиналом, вы можете перейти к зеркалу и получить старое значение. Это немного сложнее, чем кажется, потому что вам также придется обновить зеркальную электронную таблицу с помощью скрипта, но не все события в электронной таблице запускают onEdit события, например вставка строк. Таким образом, ваш сценарий должен быть очень умным, чтобы не отставать от них, что, в зависимости от вашего использования, может быть даже невозможно.

person Henrique G. Abreu    schedule 16.06.2012
comment
Спасибо за ответ. Я смотрел на запрос улучшения. Я знал ссылку на эту документацию, но это не могло быть только этим! ;-) - person VanacK; 18.06.2012
comment
Согласно комментарию № 47 по проблеме 200, та же проблема, о которой говорил Энрике, теперь можно получить доступ к предыдущему значению с помощью onEdit(e) ... e.oldValue. - person Rubén; 04.01.2016
comment
Используя e.oldValue, я получаю undefined, пожалуйста, помогите мне - person Sri P; 29.08.2016
comment
Хотя это запоздалый комментарий в ответ на Шри П выше, я надеюсь, что он все еще будет полезен для будущих читателей: основная причина, по которой вы получаете «undefined», заключается в том, что редактирование не было выполнено в одной ячейке. Документы (developers.google.com/apps-script/guides/triggers/events) заявляют, что e.oldValue доступен только в том случае, если отредактированный диапазон представляет собой одну ячейку. Если кто-то вставляет или удаляет содержимое более чем в одной ячейке за раз, свойство oldValue отсутствует. Это досадное ограничение API. Надеюсь, Google когда-нибудь позволит захватывать диапазоны oldValue. - person John Mark Mitchell; 11.01.2018
comment
Это запрос функции для реализации oldValue для диапазона ячеек Issueetracker.google.com/issues/63898675 Обязательно пометьте его, если хотите, чтобы это было исправлено. Также, возможно, стоит попробовать эту расширенную версию onEdit () (сам не тестировал): gist.github.com/tanaikech/73edaed1268a6d07118aed538aa5608d - person jlo; 14.02.2019
comment
Примечание. Предыдущее значение доступно только в случае редактирования отдельной ячейки. Если пользователь вставил несколько ячеек в наблюдаемый диапазон, старые значения будут недоступны. - person Adil Malik; 03.04.2021
comment
@SriP дает undefined, если до этого ячейка была пустой - person Adil Malik; 03.04.2021

Вы можете использовать ScriptDB для хранения информации onLoad(), а затем прочитать ее обратно onEdit(). Каждый раз при редактировании вы можете снова вызвать onLoad(), чтобы снова обновить базу данных значений ячеек или просто заменить соответствующую информацию в базе данных.

Добавьте notonEdit() для запуска по событию FromSpreadsheet> onEdit () в меню «Ресурсы»> «Все триггеры».

Вот код:

function onLoad() {

  var db = ScriptDb.getMyDb()

  //get array of the sheet range that has something in it
  var sheet = SpreadsheetApp.getActiveSheet()
  var lastrow = sheet.getLastRow()
  var lastcolumn = sheet.getLastColumn()
  var subsheet = sheet.getRange(1, 1, lastrow, lastcolumn) 
  var values = subsheet.getValues() 

  //write that array into the ScriptDB of the project 
      for (i=1; i<=lastrow; i++){
        for (j=1; j<=lastcolumn; j++){
          var object = {type: "onEditfudge", row: i, column:j, value:values[i-1][j-1]}  
          db.save(object)
          Logger.log(object) //log it to check its correct..
        }
      }    
}

function BeforeonEdit(){

  db = ScriptDb.getMyDb()
  var newrange = SpreadsheetApp.getActiveRange()


  //get 'old value'
  var dbentry = db.query({type: "onEditfudge", row:newrange.getRow(),column:newrange.getColumn()}).next()
  var oldvalue = dbentry.value    

  //overwrite the 'old value' with the 'new value' for the next onEdit() event
 dbentry.value = newrange.getValue()
 db.save(dbentry)

 //return the old value to do something with in the calling function  
 return oldvalue  
}

function notonEdit(){

  //show new and old value    
  Browser.msgBox("Old value is: " + BeforeonEdit() + ". New Value is: " + SpreadsheetApp.getActiveRange().getValue()) 

}
person tomrobpowell    schedule 22.07.2012
comment
Спасибо за идею, но в моем случае она показалась мне непрактичной, у меня в таблице около 45 листов. Моя таблица большая. Я считаю, что ваш метод будет слишком медленным. - person VanacK; 24.07.2012
comment
вы можете взглянуть на сохранение объектов партиями, а не по отдельности, это может улучшить производительность - но все это должно быть в любом случае при запуске, поэтому, пока вы используете электронную таблицу, не должно быть никаких задержек в зависимости от размера самой БД. . см. method saveBatch(jsData, atomic) здесь - person tomrobpowell; 25.07.2012