@DasIstGlitch

Google Apps Script для Google таблиц: как переименовать все листы в таблице скриптом?

Приветствую!
Есть две Гугл таблицы:
  • Таблица 1 с исходными данными. В ней n-листов.
  • Таблица 2 с информацией для пользователя, которая забирается из Таблицы 1 при помощи =importrange().
    В Таблице 2 так же несколько листов, название которых соответствует значению в ячейке.

Листы в Таблице 2 должны автоматически переименовываться, когда меняется ячейке. Написанный скрипт + триггер(installable) работают для активного или только первого листа, так как используются классы getActiveSheet и renameActiveSheet:

function NewSheetName() {
 var myValue = SpreadsheetApp.getActiveSheet( ).getRange("J2").getValue();
 SpreadsheetApp.getActiveSpreadsheet().renameActiveSheet(myValue);
}


Как работает: после срабатывания триггера переименовывается только первый или открытый лист.
Как нужно: после срабатывания триггера все листы в Таблице 2 переименовываются без дополнительного участия, даже без открытия таблиц.

p.s. В мануале по скриптам не нашёл класса, который бы работал с любым листом, а не только с активным. Как переименовать лист по ID не осилил.
  • Вопрос задан
  • 2292 просмотра
Решения вопроса 2
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Вам просто необходимо получить листы Таблицы, и переименовать их как надо.

Решение

SpreadsheetApp.openById('blah-blah')
  .getSheets()
  .forEach(function(sheet) {
    var name = sheet.getRange('J2').getValue();
    if (name)
      try {
        sheet.setName(name);
      } catch (error) {
        console.error('CATCHED', error);
      }
  });


Как делают

Основная идея заключается в том, чтобы перебрать все элементы массива, отсортировать лишнее, а с выбранными элементаи произвести действие. Функция userActionRenameSheets демонстрирует это.

/* exported userActionRenameSheets */

/**
 * Действие пользователя или триггера. Внешний вызов без параметров
 */
function userActionRenameSheets() {
  var spreadsheet = SpreadsheetApp.openById('blah-blah');

  /** @type {filterSheets} */
  var filterSheets = function(sheet) {
    return true;
  };

  /** @type {renameRule} */
  var renameRule = function(sheet) {
    var name = sheet.getRange('J2').getValue();
    if (name)
      try {
        sheet.setName(name);
      } catch (error) {
        console.error('CATCHED', error);
      }
    return sheet;
  };

  var sheets = renameSheetsByCellValue_(spreadsheet, filterSheets, renameRule);
  // Делать что-нибудь дальше
}

/**
 * Переименовывает листы в Таблице согласно заданным правилам
 *
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet Таблица,
 *         в которой производим переименование
 * @param {filterSheets} Фильтр листов на всякий случай, вдруг что-то надо да пропустить
 * @param {renameRule} Правило переименования, может возвращать что угодно
 * @param {any[]} Массив отфильрованных результатов функции renameRule
 */
function renameSheetsByCellValue_(spreadsheet, filterSheets, renameRule) {
  var res;
  var sheets = spreadsheet.getSheets();
  if (filterSheets) res = sheets.filter(filterSheets) || sheets;
  if (renameRule) res = res.map(renameRule);
  return res;
}

/**
 * Фильтр листов
 * @callback filterSheets
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Текущий лист
 * @param {number} index Текущий индекс массива
 * @param {GoogleAppsScript.Spreadsheet.Sheet[]} sheets Текущий массив
 * @returns {boolean}
 */

/**
 * Правило переименования
 * @callback renameRule
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Текущий лист
 * @param {number} index Текущий индекс массива
 * @param {GoogleAppsScript.Spreadsheet.Sheet[]} sheets Текущий массив
 * @returns {any}
 */
Ответ написан
@DasIstGlitch Автор вопроса
Вдруг кому-то пригодится: переименовываем все листы из всех таблиц папке на Google Disk
function ActionRenameSheets() {
var files = DriveApp.getFolderById('qwer1234').getFiles(); //открываем папку по ID и получаем файлы
while (files.hasNext()) {  //цикл последовательного открытия файлов в папке
  var file = files.next();
  SpreadsheetApp.openById(file.getId()) //получаем ID файла и открываем 
  .getSheets()
  .forEach(function(sheet) { //последовательная работа с листами
    var name = sheet.getRange('F2').getValue(); //получаем значение из ячейки F2
    if (name)
      try {
        sheet.setName(name); //переименовываем листы
      } catch (error) {
        console.error('CATCHED', error);
      }
  });
}}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы