#google-apps-script #google-sheets #synchronization
#google-apps-script #google-sheets #синхронизация
Вопрос:
Я пытаюсь создать скрипт, чтобы при внесении изменений в одну электронную таблицу соответствующий лист с тем же именем в другой электронной таблице получал те же изменения в том же месте, и поэтому я могу поместить по одному фрагменту сценария в каждый и получить два связанных листа, которые влияют друг на друга.
это код:
var targetID = 'ID of the sheet';
var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
function onEdit(e){
var range = e.range;
var value = e.value;
var row = range.getRowIndex();
var column = range.getColumnIndex();
exportValue(row,column,value)
}
function exportValue(row,column,value) {
//(**this is the point where it breaks**)
var s = SpreadsheetApp.openById(targetID).getSheetByName(targetSheet);
var target = s.getRange(row, column);
target.setValue(value);
}
В моей версии я вставлял журналы между каждой строкой, чтобы увидеть, где произошел сбой, и это дошло до строки, где я написал «это точка, где это прерывается«, а затем ничего не возвращал после этого.
После попытки этого я попытался открыть другой файл, просто извлекая все переменные, но я не смог заставить его работать.
текущие сообщения об ошибках, с которыми он отправляется, являются:
Не удается найти функцию getSheetByName в object Sheet
Не удается найти функцию openById в object Spreadsheet
Я уже потратил на это так много времени, и я чувствую, что ответ действительно прост, но я был бы очень признателен за любой совет
Заранее спасибо
🙂
Комментарии:
1. Вы указали здесь идентификатор цели?
var targetID = 'ID of the sheet';
2. @Cooper спасибо за ваш комментарий, я вставил это просто так, чтобы люди не могли видеть мою ссылку
Ответ №1:
Связанные электронные таблицы с устанавливаемыми триггерами onEdit ()
Я заставил это работать, используя устанавливаемый триггер onEdit (e).
function Linked1Edit(e){
var ss=SpreadsheetApp.openById('The Other Spreadsheets ID');
var sh=ss.getSheetByName(e.range.getSheet().getName());
var rg=sh.getRange(e.range.rowStart,e.range.columnStart);
rg.setValue(e.value);
}
Я вызвал один Linked1Edit (e), а другой Linked2Edit (e) и создал устанавливаемый триггер onEdit (e) для каждого из них, и теперь они пишут друг другу.
К сожалению, это работает только для однозначных изменений.
Следующий скрипт позволит вам вносить изменения более чем в одно значение одновременно.
function Linked1Edit(e){
var ss=SpreadsheetApp.openById('The Other Spreadsheet ID');
var sh=ss.getSheetByName(e.range.getSheet().getName());
var rg=sh.getRange(e.range.rowStart,e.range.columnStart,e.range.rowEnd-e.range.rowStart 1,e.range.columnEnd-e.range.columnStart 1);
var vA=e.range.getValues();
rg.setValues(vA);
}
Создание триггера
Выберите триггеры текущего проекта
Нажмите Добавить триггер:
Создать диалоговое окно запуска:
Вы также можете создать триггер в коде. Смотрите Класс ScriptApp
Комментарии:
1. спасибо за ответ, я не могу понять, почему это не сработает, но это не так. Я вставил регистраторы, но, похоже, они не выходят за пределы строки ss, можете ли вы назвать причину этого
2. Я только что попробовал использовать точно такую же функцию и удалить все элементы ‘e.’, чтобы она просто переходила к определенной ячейке и писала ‘это сработало!!!’, и это сработало, поэтому я попытался перевести это обратно в формат onEdit, и это не сработало, я действительно не знаю, что делать
3. Я так понимаю, вы пытаетесь запустить функцию из редактора сценариев, и это ошибка.
4. Также это не будет работать с простым триггером, поэтому вы не можете просто назвать его onEdit (e) и запустить его, вам нужно использовать устанавливаемый триггер onEdit и указать его на имя функции. Триггер, который вы создаете в диалоговом окне project triggers. Для открытия другой электронной таблицы требуются разрешения простые триггеры не обрабатывают процессы, требующие разрешений.
5. Кстати, я тестировал этот код. с этим было весело играть