Вызов конечной точки API при внесении изменений в любые файлы Google Sheets - PullRequest
1 голос
/ 15 января 2020

Чего я добиваюсь sh для достижения:

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

Мой подход: я считаю, что мне нужно дополнение Google Scripts. Установлено для всех пользователей домена.

Я вижу, что есть "связанные" скрипты и автономные скрипты. Для автономных сценариев я не могу создавать другие триггеры, кроме триггеров, основанных на таймере и календаре. Связанные сценарии кажутся навсегда связанными с одним листом и никак не влияют на другие листы.

Чего мне не хватает?

Я нашел несколько сквозных руководств по блоги для создания связанных скриптов, но ничего для универсального c междоменного материала.

1 Ответ

3 голосов
/ 15 января 2020

Вы можете достичь всего этого с помощью отдельного скрипта. Создайте автономный сценарий и выполните следующие действия:

Шаг 1. Получите идентификаторы электронных таблиц

Сначала вам нужно будет получить id различных электронных таблиц на общем диске. Вы можете сделать это в самом скрипте Служб Google, если используете Advanced Drive Service (см. Справочник ниже). Чтобы активировать эту службу, от go до Resources > Advanced Google services... в редакторе сценариев и включите Drive API.

Затем напишите функцию, которая будет возвращать массив электронной таблицы ids на общем диске. Вам придется позвонить Drive.Files.list для этого. Это может быть что-то вроде следующих строк (пожалуйста, напишите ваш общий driveId в соответствующей строке):

function getFileIds() {
  var params = {
    corpora: "drive",
    driveId: "your-shared-drive-id", // Please change this accordingly
    includeItemsFromAllDrives: true,
    q: "mimeType = 'application/vnd.google-apps.spreadsheet'",
    supportsAllDrives: true
  }
  var files = Drive.Files.list(params)["items"];
  var ids = files.map(function(file) {
    return file["id"];
  })
  return ids;
}

Шаг 2: Создайте триггеры для каждой электронной таблицы

Установите onEdit запускать программно для каждой из электронных таблиц (триггер редактирования запускает функцию каждый раз, когда редактируется соответствующая электронная таблица, поэтому я предполагаю, что это именно тот триггер, который вам нужен). Для этого будет использоваться ids, полученный на шаге 1. Это может быть что-то похожее на это:

function createTriggers(ids) {
  ids.forEach(function(id) {
    var ss = SpreadsheetApp.openById(id);
    createTrigger(ss);
  })
}

function createTrigger(ss) {
  ScriptApp.newTrigger('sendDataOnEdit')
    .forSpreadsheet(ss)
    .onEdit()
    .create();
}

Функция createTriggers получает массив ids в качестве параметра и для каждого id создает триггер onEdit: каждый раз, когда любой из Эти электронные таблицы редактируются, будет запускаться функция sendDataOnEdit, и именно здесь вы захотите вызвать конечную точку API с информацией об отредактированной ячейке.

Шаг 3. Вызовите конечную точку API

. Функция sendDataOnEdit должна получить данные из отредактированной ячейки и отправить их куда-нибудь.

function sendDataOnEdit(e) {
  // Please fill this up accordingly
  var range = e.range;
  var value = range.getValue();
  UrlFetchApp.fetch(url, params) // Please fill this up accordingly
}

Во-первых, он может получить информацию о ячейке, отредактированной с помощью объекта события, переданной функции в качестве параметра e (вы можете получить ее столбец, ее строку, ее значение, лист и электронная таблица, где он находится, и т. д. c.). Например, чтобы получить значение ячейки, вы можете сделать e.range.getValue(). Чтобы получить более подробную информацию, перейдите по ссылке, которую я предоставляю в качестве ссылки.

Во-вторых, когда вы правильно извлекли данные, которые хотите отправить, вы можете использовать UrlFetchApp.fetch(url, params), чтобы сделать запрос на ваш URL. В приведенной ниже ссылке вы можете увидеть параметры, которые вы можете указать здесь (например, HTTP-метод, полезная нагрузка и т. Д. c.).

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

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

Подводя итог:

Чтобы создать триггеры, вы должны запустить createTriggers один раз (если вы запустите его несколько раз, он начнет создавать дубликаты). Запустите, например, эту функцию, которая сначала получает файл ids через Drive API, а затем создает соответствующие триггеры:

function main() {
  var ids = getFileIds();
  createTriggers(ids);
}

Также было бы полезно иметь функцию, которая удалит все триггеры , Запустите это, если вы хотите начать с fre sh и убедитесь, что у вас нет дубликатов:

function deleteTriggers() {
  var triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(trigger) {
    ScriptApp.deleteTrigger(trigger);
  })
}

Ссылка:

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...