Google script, как получить доступ и вставить при редактировании к определенному листу в другой электронной таблице?

#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. Кстати, я тестировал этот код. с этим было весело играть