Как получить список всех имен листов, содержащих «неделю», которые обновляются при редактировании

Я новичок в Apps Script, и мне нужна помощь с кодом, необходимым для получения списка всех имен листов (текущих и создаваемых), которые начинаются с «Недели» в заголовке. В идеале это будет обновляться по мере создания новых листов (либо при редактировании, либо при открытии).

Код ниже - это то, что у меня есть до сих пор, но он нужен для фильтрации листов и отображения только тех, которые начинаются с "недели", а также для его обновления при добавлении новых листов.

/**
 * Returns the names of all sheets.
 * 
 * @return The name of all sheets in the Google Sheets spreadsheet.
 * @customfunction
 */
function ALLSHEETNAMES() {
  let ss = SpreadsheetApp.getActive();
  let sheets = ss.getSheets();
  let sheetNames = [];
  sheets.forEach(function (sheet) {
    sheetNames.push(sheet.getName());
  });
  return sheetNames;
}

Если найден какой-то код (см. ниже), который не будет подсчитывать первое количество листов x, но я не уверен, что это останется так по мере роста документа, поэтому я бы предпочел найти что-то, что будет использовать фильтр «неделя» вместо заданное количество листов, которые следует игнорировать.

function sheetNameArray() {
var out = new Array()
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=6; i<sheets.length ; i++) out.push( [ sheets[i].getName() ] )
return out 
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Получите значение «Недели»

Ваш код почти готов. Вы просто добавляете условие, в котором используете toLowerCase() и includes(), чтобы получить желаемый результат.


Используемый скрипт:

 /**
 * Returns the names of all sheets containing 'week of'.
 * 
 * @return The name of all sheets all sheets containing 'week of' in the Google Sheets spreadsheet.
 * @customfunction
 */

function getAllWeekOfInSheetNames() {
  let ss = SpreadsheetApp.getActive();
  let sheets = ss.getSheets();
  let sheetNames = [];
  sheets.forEach(function (sheet) {
    if (sheet.getName().toLowerCase().includes('week of')){
      sheetNames.push(sheet.getName());
    }
  });
  return sheetNames;
}

Ссылка:

Насколько я понял, вы хотите использовать это решение, но с .startsWith('Week of') вместо .includes(... .

Tgralak 29.08.2024 15:30

Хотя у него есть некоторые веские аргументы, я думаю, что ОП будет иметь определенный шаблон в соглашении об именах листов, и это не должно иметь значения. Еще одна вещь, о которой я подумал при изменении кода, заключалась в том, что в заголовке указано contains 'week of'.

Lime Husky 29.08.2024 15:36

Большое спасибо! это решило неделю проблемы. Есть ли что-то еще, что мне нужно добавить в код, чтобы обеспечить его обновление при добавлении новых листов? Меня устраивает либо опция редактирования, либо опция открытия. Будет ли добавление триггера работать или лучше встроить его в код?

Shailen Vadera 29.08.2024 17:19

@ShailenVadera Пользовательская функция пересчитывается при изменении одного из ее параметров. См. Обновление данных, полученных с помощью специальной функции в Google Sheet.

Wicket 29.08.2024 18:20

Лайм Хаски: Поскольку функция возвращает не все имена листов, было бы неплохо изменить имя функции. Также обратите внимание, что первый фрагмент содержит тег JSDoc @customformula.

Wicket 29.08.2024 18:24

@Wicket, спасибо за информацию, я обновил код, который теперь соответствует функции.

Lime Husky 29.08.2024 18:41

@LimeHusky, извини, я допустил ошибку в своем предыдущем комментарии. Правильный тег — @customfunction (я уже удалил @customformula из вашего ответа).

Wicket 29.08.2024 18:54

Получить значение «Недели» | Не чувствителен к регистру

У меня другой подход к получению значения Week of.
Это not case sensitive хотите ли вы получить значение «Неделя», «НЕДЕЛЯ», «неделя» или т. д.

Я использовал regex

вот код:

function ALLSHEETNAMES() {
  let ss = SpreadsheetApp.getActive();
  let sheets = ss.getSheets();
  let sheetNames = [];
  sheets.forEach( sheet => {
    sheetNames.push(sheet.getName());
  });
  
  const regex = /\bweek\s+of\b/i;
  const matchedSheets = [];

  for(let i = 0; i < sheetNames.length; i++){
    if (regex.test(sheetNames[i])){
      matchedSheets.push(sheetNames[i]);
    }
  }

  return matchedSheets;

}

Ссылка:

  • РЕГИСТРАЦИОННОЕ ВЫРАЖЕНИЕ
  • FOREACH

Чтобы получить имена листов, начинающиеся с «Неделя»:

let sheetNames = sheets.filter((sheet)=> sheet.startsWith('Week of'))

Другие вопросы по теме