Я новичок в 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
}
Ваш код почти готов. Вы просто добавляете условие, в котором используете 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;
}
Хотя у него есть некоторые веские аргументы, я думаю, что ОП будет иметь определенный шаблон в соглашении об именах листов, и это не должно иметь значения. Еще одна вещь, о которой я подумал при изменении кода, заключалась в том, что в заголовке указано contains 'week of'
.
Большое спасибо! это решило неделю проблемы. Есть ли что-то еще, что мне нужно добавить в код, чтобы обеспечить его обновление при добавлении новых листов? Меня устраивает либо опция редактирования, либо опция открытия. Будет ли добавление триггера работать или лучше встроить его в код?
@ShailenVadera Пользовательская функция пересчитывается при изменении одного из ее параметров. См. Обновление данных, полученных с помощью специальной функции в Google Sheet.
Лайм Хаски: Поскольку функция возвращает не все имена листов, было бы неплохо изменить имя функции. Также обратите внимание, что первый фрагмент содержит тег JSDoc @customformula
.
@Wicket, спасибо за информацию, я обновил код, который теперь соответствует функции.
@LimeHusky, извини, я допустил ошибку в своем предыдущем комментарии. Правильный тег — @customfunction
(я уже удалил @customformula
из вашего ответа).
У меня другой подход к получению значения 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;
}
Чтобы получить имена листов, начинающиеся с «Неделя»:
let sheetNames = sheets.filter((sheet)=> sheet.startsWith('Week of'))
Насколько я понял, вы хотите использовать это решение, но с
.startsWith('Week of')
вместо.includes(...
.