Google Sheets - Замените лист, не прерывая ссылки на этот лист - PullRequest
0 голосов
/ 31 августа 2018

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

Это означает, что с 50 сотрудниками у нас есть 50 таблиц для обслуживания. Я пытаюсь найти способ поместить обновления во все 50 электронных таблиц, не обновляя каждый вручную. У меня есть весь код сценариев приложений в библиотеке, на который ссылается каждый лист пользователя, поэтому мне нужно разобраться с поддержкой кодирования. Но поддерживать в актуальном состоянии электронную таблицу для каждого пользователя с новейшими функциями сложно.

Один из способов, которым я рассчитываю это сделать, - это создать пользовательский лист «Шаблон», который будет обновляться с изменениями / новыми функциями. Затем, когда каждый пользователь открывает свою электронную таблицу, он перекрестно ссылается на все свои листы на листе шаблона и проверяет, нужно ли заменить его лист на последний лист, основываясь на времени, когда он был обновлен в листе шаблона. Например, если лист «Отчет о проекте» в шаблоне новее, чем лист «Отчет о проекте» в электронной таблице пользователя, пользователь SS удаляет свой текущий «Отчет о проекте» и копирует лист шаблона «Отчет о проекте» в свой собственный с помощью метод copyTo ().

У меня все это работает со скриптом приложений, но теперь проблема в том, что когда локальный лист пользователя удаляется и заменяется новым обновленным сегментом, все ссылки на формулы на этот лист на других листах ломаются и заменяют ссылку на #REF , Я планировал преодолеть это, используя только именованные диапазоны, но даже именованные диапазоны ломаются, когда лист заменяется на точку, в которой даже скрипт приложения больше не может найти именованный диапазон, потому что именованный диапазон, который он ищет, автоматически переименовывается, когда была импортирована новая версия листа (иначе, «CustomNamedRange» в шаблоне SS был переименован в «« SheetName »! CustomNamedRange» в пользовательском SS).

Единственный известный мне способ преодоления этой проблемы на данный момент - это создание централизованной электронной таблицы «Range Index», в которой есть все именованные диапазоны с их целевым листом и диапазоном. Я должен был бы создать пользовательскую функцию, которая фильтрует по индексу диапазона и находит нужный адрес на основе заданного имени. Например, вместо вызова «CustomNamedRange» в формуле листа я бы вызвал пользовательскую функцию: getNamedRange («CustomNamedRange»), и скрипт приложения вернул бы диапазон, найденный в индексе диапазона. И когда лист заменяется более новой версией, никакие ссылки не прерываются, потому что все ссылки проходят через функцию фильтра скрипта приложения.

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

У кого-нибудь есть другие идеи о том, как добиться того, что я ищу? Как сохранить 50+ отдельных таблиц, обновленных новыми функциями, без необходимости делать это вручную и не нарушая все ссылки?

Извините за длинный пост, но я ценю любые идеи!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я еще не смог протестировать его реализацию, но я верю, что ответ выше - это то, что я искал изначально.

Я еще не тратил время на возмущение API, поэтому пока нашел другое решение:

Google Sheets недавно добавил макросы в свой набор функций. Прелесть этого в том, что Вы можете просматривать и редактировать код макроса после того, как записали свои действия на листе. На данный момент я планирую записывать макрос при обновлении листа шаблона, а затем копировать скрипт для этого макроса в пользовательскую функцию в моей библиотеке, которая будет запускаться каждый раз, когда пользователь открывает свою электронную таблицу. Когда они открывают свои SS, скрипт приложения проверит, имеет ли функция макроса библиотеки более позднюю дату, чем в последний раз, когда лист был открыт. Если у него есть новая дата, он запустит макрос-скрипт, и SS этого пользователя должен быть обновлен до того же состояния, что и шаблон.

0 голосов
/ 31 августа 2018

У меня была похожая проблема, и я смог ее решить, используя SheetAPI для замены текста. У меня есть шаблон с именем Sheet1_Template и он скрыт. Я удаляю Sheet1, копирую Sheet1_Template, показываю его, а затем заменяю все вхождения «Sheet1» в формулах на «Sheet1». Sheet API должен быть включен в Ресурсах и Google API Console.

function copyTemplate() {
  try {
    var spread = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spread.getSheetByName("Sheet1");
    if( sheet !== null ) spread.deleteSheet(sheet);
    sheet = spread.getSheetByName("Sheet1_Template");
    sheet = sheet.copyTo(spread);
    sheet.setName("Sheet1");
    sheet.showSheet();
    sheet.activate();
    spread.moveActiveSheet(0);
    var requests = {"requests":[{"findReplace":{"allSheets":true,"find":"Sheet1","replacement":"Sheet1","includeFormulas":true}}]};
    Sheets.Spreadsheets.batchUpdate(requests, spread.getId());
  }
  catch(err) {
    Logger.log("error in copyTemplate: "+err);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...