Заполнение строк именами таблиц электронной таблицы

#google-apps-script #google-sheets #google-sheets-api

#google-apps-script #google-sheets #google-sheets-api

Вопрос:

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

Я уже знаю некоторое кодирование, но мой опыт работы с Google API очень ограничен. Моя текущая попытка возвращает следующее исключение: «У вас нет разрешения на вызов set value». После этой ошибки Google я обнаружил, что пользовательские функции, по-видимому, не могут устанавливать значения для других ячеек, поэтому я здесь, чтобы найти альтернативу такому тривиальному поведению.

Это мой текущий код:

 function updateSheetTitles() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var cell = SpreadsheetApp.getActiveSpreadsheet().getCurrentCell();
  var row = cell.getRow();
  var column = cell.getColumn();
  for (var i=0 ; i<sheets.length ; i  ){
    if(i<1) //For passing trought the first sheet
      return;
    cell.setValue(sheets[i].getSheetName);
    var range = SpreadsheetApp.getActiveSheet().getRange(row 1, column, 1, 1);
    cell = SpreadsheetApp.getActiveSheet().setCurrentCell(range);
  }
}
 

И вот изображение, иллюстрирующее то, что я хочу:

введите описание изображения здесь

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

Комментарии:

1. Обходной путь для установки других ячеек — запустить скрипт из меню как обычную серверную функцию.

Ответ №1:

Я считаю, что ваша цель заключается в следующем.

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

Точки изменения:

  • К сожалению, setValue не может использоваться в пользовательской функции. Я думаю, что причина вашей проблемы связана с этим.
  • В вашем скрипте at cell.setValue(sheets[i].getSheetName); метод of getSheetName не выполняется. Если вы хотите использовать этот метод, пожалуйста, поставьте () лайк getSheetName() .
  • SpreadsheetApp.getActiveSpreadsheet() может быть объявлено один раз.

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

Когда вышеуказанные пункты отражены в примере сценария, он выглядит следующим образом.

Модифицированный скрипт:

Пожалуйста, скопируйте и вставьте следующий скрипт в редактор сценариев Google Spreadsheet. И, пожалуйста, поместите пользовательскую функцию =updateSheetTitles() в ячейку. При этом имена листов возвращаются в направлении строк.

 function updateSheetTitles() {
  return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(e => [e.getSheetName()]);
}
 
  • Из вашего ответа следует, что если вы хотите получить имена листов, кроме 1-го и 2-го листов, вы также можете использовать следующий сценарий.
       function updateSheetTitles() {
        return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(e => [e.getSheetName()]).slice(2);
      }
     

Список литературы:

Комментарии:

1. Большое спасибо, чувак, ты понял, почти дошел. Мне нужно исключить первые 2 названия листов, то есть возврат должен получать заголовок с третьего листа и далее. Я бы сам внес это изменение, если бы лучше понимал ваше решение.

2. @Gabriel Minosso Спасибо за ответ. На ваш дополнительный вопрос я добавил в свой ответ еще один пример сценария. Не могли бы вы подтвердить это, пожалуйста? Если я неправильно понял ваш вопрос, я прошу прощения.