#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);
метод ofgetSheetName
не выполняется. Если вы хотите использовать этот метод, пожалуйста, поставьте()
лайк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 Спасибо за ответ. На ваш дополнительный вопрос я добавил в свой ответ еще один пример сценария. Не могли бы вы подтвердить это, пожалуйста? Если я неправильно понял ваш вопрос, я прошу прощения.