Всего этого можно добиться с помощью отдельного скрипта. Создайте автономный скрипт и выполните следующие действия:
Шаг 1. Получите идентификаторы таблиц
Сначала вам нужно получить id
различных электронных таблиц на вашем общем диске. Вы можете сделать это в самом скрипте Google Apps, если используете Advanced Drive Service
(см. Справочник ниже). Чтобы активировать эту службу, перейдите к 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
(вы можете получить ее столбец, ее строку, ее значение, лист и электронную таблицу, в которой она расположена, и т. Д. ). Например, чтобы получить значение ячейки, вы можете сделать e.range.getValue()
. Проверьте ссылку, которую я предоставил, чтобы получить более подробную информацию об этом.
Во-вторых, когда вы правильно получили данные, которые хотите отправить, вы можете использовать UrlFetchApp.fetch(url, params)
, чтобы сделать запрос на свой URL. В приведенной ниже ссылке вы можете увидеть параметры, которые вы можете указать здесь (например, метод HTTP, полезные данные и т. Д.).
Имейте в виду, что вам может потребоваться предоставить некоторую авторизацию для доступа к конечной точке API, если она не является общедоступной. Проверьте ссылку OAuth, которую я прилагаю ниже.
(Вы должны соответствующим образом отредактировать эту функцию, чтобы получать и отправлять именно то, что вы хотите. Я написал пример).
Подводя итог:
Чтобы создать триггеры, вы должны запустить createTriggers
один раз (если вы запустите его несколько раз, он начнет создавать дубликаты). Запустите, например, эту функцию, которая сначала получает файл ids
через Drive API, а затем создает соответствующие триггеры:
function main() {
var ids = getFileIds();
createTriggers(ids);
}
Также было бы полезно иметь функцию, которая будет удалять все триггеры. Запустите это, если вы хотите начать с нуля и убедитесь, что у вас нет дубликатов:
function deleteTriggers() {
var triggers = ScriptApp.getProjectTriggers();
triggers.forEach(function(trigger) {
ScriptApp.deleteTrigger(trigger);
})
}
Ссылка:
Я надеюсь, что это поможет.
person
Iamblichus
schedule
15.01.2020