Получите подробную информацию о ячейках, измененных из уведомления об изменении таблицы Google в машиночитаемом формате.

Если у меня есть таблица Google, например

https://docs.google.com/spreadsheet/ccc?key=0AjAdgux-AqYvdE01Ni1pSTJuZm5YVkJIbl9hZ21PN2c&usp=sharing

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

И я вносил изменения в эту электронную таблицу с помощью API электронных таблиц, то есть не вручную.

Затем я получаю письмо, подобное этому:

Тема: "Тест уведомления" был отредактирован недавно

См. Изменения в вашем документе Google "Тест уведомления": нажмите здесь

другой человек внес изменения с 01.10.2014 12:23 в 12:23 (среднее время по Гринвичу)

  • Значения изменены

Если я открою ссылку "Нажмите здесь", я получу этот URL, который показывает мне ячейку, которая изменилась в электронной таблице:

https://docs.google.com/a/DOMAINGOESHERE/spreadsheet/ver?key=tn9EJJrk6KnJrAEFaHI8E3w&t=1389356641198000&pt=1389356621198000&diffWidget=true&s=AJVazbUOm5tHikrxX-bQ0oK_XEapjEUb-g

Мой вопрос:

Есть ли способ получить информацию о том, какая ячейка изменилась, в формате, с которым я могу работать программно, например, JSON?

Я просмотрел API Google Spreadsheet: https://developers.google.com/google-apps/spreadsheets/

и в редакциях Drive API: https://developers.google.com/drive/manage-revisions

Я также попытался настроить событие onEdit() с помощью скрипта Служб Google: https://developers.google.com/apps-script/understanding_triggers

Я думал, что этот последний подход будет ответом.

Проблема этого подхода заключается в том, что хотя onEdit можно использовать для отправки подробных сведений об изменениях по электронной почте, он запускается только в том случае, если электронная таблица редактируется вручную, а моя обновляется программно через API электронных таблиц.

Есть идеи?

1 ответ

Вы можете создать функцию, которая проверяет изменения. Один из способов сделать это - сравнить несколько экземпляров одной и той же электронной таблицы. Если есть различия, вы можете написать себе. Используя синхронизированный по времени триггер, вы можете проверять каждую минуту, час, день или неделю (в зависимости от ваших потребностей).

var sheet = **whatever**;//The spreadsheet where you will be making changes
var range = **whatever**;//The range that you will be checking for changes
var compSheet = **whatever**;//The sheet that you will compare with for changes
function checkMatch(){
  var myCurrent = sheet.getRange(range).getValues();
  var myComparison = compSheet.getRange(range).getvalues();
  if(myCurrent == myComparison){//Checks to see if there are any differences
    for(i=0;i<compSheet.length;++i){ //Since getValues returns a 'multi-dimensional' array, 2 for loops are used to compare each element
     for(j=0;j<compSheet[i].length;++i){
      if(myCurrent[i][j] != myComparison[i][j]){//Determines if there is a difference;
       //***Whatever you want to do with the differences, put them here***
     }
    }

    myEmailer(sheet.getUrl());//Passes the url of sheet to youur emailer function 
    compSheet.getRange(range).setValues(myCurrent);//Updates compSheet so that next time is can check for the next series of changes
    }
  }

Затем в разделе " Ресурсы"> " Триггеры текущего проекта" вы можете настроить запуск checkMatch каждую минуту.

Также проверьте https://developers.google.com/gdata/samples/spreadsheet_sample для получения данных в формате json

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