Вопрос по google-sheets, google-apps-script – onEdit Событие доступа к предыдущему значению ячейки, которая была изменена?

3

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

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

OnEdit (событие)

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

Ваш Ответ

2   ответа
3

--edit Кажется, теперь это возможно, пожалуйста, посмотрите на ссылки и комментарии ниже.

Подробная информация по документацииВот.

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

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

Спасибо за ответ. Я "смотрел" запрос на улучшение. Я знал ссылку на эту документацию, но это не могло быть только этим! ;-) VanacK
Используя e.oldValue, я получаю "undefined", пожалуйста, помогите мне
Согласноcomment #47 on issue 200та же проблема, о которой говорил Henrique, теперь можно получить доступ к предыдущему значению, используяonEdit(e) ... e.oldValue.
Хотя это поздний комментарий в ответ на Шри П выше, я надеюсь, что он по-прежнему будет полезен для будущих читателей: основная причина, по которой вы получаете «неопределенный»; является то, что редактирование не было сделано на одной ячейке. Документы (developers.google.com/apps-script/guides/triggers/events) заявить, что e.oldValue «доступно только в том случае, если редактируемый диапазон представляет собой одну ячейку». Если кто-то вставляет или удаляет содержимое более чем в одну ячейку за раз, свойства oldValue не будет. Это неудачное ограничение API. Надеемся, что Google позволит в будущем фиксировать диапазоны oldValue.
Это запрос функции для реализации oldValue для диапазона ячеекissuetracker.google.com/issues/63898675 Удостоверьтесь, чтобы отметить это, Вы хотите, чтобы это было установлено. Также, возможно, стоит попробовать эту расширенную версию onEdit () (не проверял сам):gist.github.com/tanaikech/73edaed1268a6d07118aed538aa5608d
1

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

добавлятьnotonEdit() вызвать событие FromSpreadsheet & gt; onEdit () в меню "Ресурсы & gt; Все ваши триггеры".

Вот код:

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()) 

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

Похожие вопросы