Немного про sheet id

Так бывает всегда: учишь теорию, делаешь задания — всё понятно. А потом садишься за практический и нужный пример и всё. Не хватает функционала скриптов.
А когда ты ещё и в начале пути… Спрашиваешь — да как так-то?
Подобное случилось со мной, когда я попытался обратиться к листу по его 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];}

Что делает функция?

  1.  Получает массив в виде объектов всех листов через getSheets()
  2.  Фильтрует их по заданному id через filter( ws => {return ws.getSheetId() === id;}
  3.  Возвращает первый объект в массиве — [0] Sheet

Далее, в тексте основного скрипта происходит обращение к этому единственному объекту Sheet  для получения его имени через sheet.getSheetName():

const sheet = getSheetById(0112358132134);
const sheetName = sheet.getSheetName();
const ws = ss.getSheetByName(sheetName);

Где взять sheet id

  1.  В редакторе скриптов const ws = ss.getSheetByName(sheetName).getSheetId();
  2.  В строке браузера, в самом конце — edit#gid=0112358132134 

Итого

Да, сам код немного удлинился, но теперь, как бы пользователь не переименовал лист, скрипт все равно будет выполняться, получая его актуальное имя.

Добавить комментарий