Так бывает всегда: учишь теорию, делаешь задания — всё понятно. А потом садишься за практический и нужный пример и всё. Не хватает функционала скриптов.
А когда ты ещё и в начале пути… Спрашиваешь — да как так-то?
Подобное случилось со мной, когда я попытался обратиться к листу по его ID!
Sheet ID — просто о сложном
Как обычно обращаются к листу? В стандартном функционале по имени, а конкретнее, вот так:
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName('sheetName');
}
Но если в дальнейшем, пользователь, имеющий доступ к книге в режиме правки, переименует лист ‘sheetName‘, то скрипт выдаст ошибку и выполняться не будет. Не совсем удобно для универсальных решений с многопользовательским доступом. Да, можно ограничить права, но можно и поступить иначе, а именно обращаться к листу по его id, который, к великому счастью, как бы не переименовывался лист, останется уникальным и неизменным:
function getSheetById(id) {
return SpreadsheetApp.getActiveSpreadsheet().getSheets().filter( ws => {return ws.getSheetId() === id;})[0];}
Что делает функция?
- Получает массив в виде объектов всех листов через getSheets()
- Фильтрует их по заданному id через
filter( ws => {return ws.getSheetId() === id;}
- Возвращает первый объект в массиве — [0] Sheet
Далее, в тексте основного скрипта происходит обращение к этому единственному объекту Sheet для получения его имени через sheet.getSheetName()
:
const sheet = getSheetById(0112358132134);
const sheetName = sheet.getSheetName();
const ws = ss.getSheetByName(sheetName);
Где взять sheet id
- В редакторе скриптов
const ws = ss.getSheetByName(sheetName).getSheetId();
- В строке браузера, в самом конце — edit#gid=0112358132134
Итого
Да, сам код немного удлинился, но теперь, как бы пользователь не переименовал лист, скрипт все равно будет выполняться, получая его актуальное имя.