Настройка триггера, когда Google Sheet обновляется IFTTT - PullRequest
0 голосов
/ 12 мая 2018

Я использую IFTTT для обновления своих листов Google при получении SMS. Теперь я хотел бы сделать шаг вперед и написать скрипт Google Apps, который бы делал разные вещи с данными, обновляемыми IFTTT, в моем Google Sheet. Я пытался добиться того же с помощью функции onEdit скрипта Google Apps, но это не работает. Я провел большой поиск на нескольких форумах по этой проблеме и узнал, что onEdit работает только тогда, когда «пользователь» вносит изменения в Google Sheet, а не когда изменения производятся по запросу API (я полагаю, что IFTTT использует тот же самый). Я не смог увидеть ни одного поста с рабочим решением.

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

После долгих поисков в Google я обнаружил, что код ниже работает на меня. Он вдохновлен этим ответом от Mogsdad.

function myOnEdit(e) {
  if (!e) throw new Error( "Event object required. Test using test_onEdit()" );
  // e.value is only available if a single cell was edited
  if (e.hasOwnProperty("value")) {
    var cells = [[e.value]];
  }
  else {
    cells = e.range.getValues();
  }
  row = cells[cells.length - 1];
  // Do anything with the row data here
}

function test_onEdit() {
  var fakeEvent = {};
  fakeEvent.authMode = ScriptApp.AuthMode.LIMITED;
  fakeEvent.user = "hello@example.com";
  fakeEvent.source = SpreadsheetApp.getActiveSpreadsheet();
  fakeEvent.range = fakeEvent.source.getActiveSheet().getDataRange();
  // e.value is only available if a single cell was edited
  if (fakeEvent.range.getNumRows() === 1 && fakeEvent.range.getNumColumns() === 1) {
    fakeEvent.value = fakeEvent.range.getValue();
  }
  onEdit(fakeEvent);
}

// Installable trigger to handle change or timed events
// Something may or may not have changed, but we won't know exactly what
function playCatchUp(e) {
  // Build a fake event to pass to myOnEdit()
  var fakeEvent = {};
  fakeEvent.source = SpreadsheetApp.getActiveSpreadsheet();
  fakeEvent.range = fakeEvent.source.getActiveSheet().getDataRange();
  myOnEdit(fakeEvent);
}

Надеюсь, это поможет кому-то в будущем. Обратите внимание, что функции playCatchUp и myOnEdit должны быть установлены как триггеры действий «изменить» и «редактировать» соответственно в скрипте Google Apps.

...