#google-apps-script #google-sheets
Вопрос:
Я унаследовал файл Google Sheets, который необходимо обновлять каждый месяц. Каждая новая вкладка называется ммм гггг (январь 2021, февраль 2021 и т.д.). Проблема в том, что есть вкладки, охватывающие более 3 лет, и новые вкладки всегда находятся в конце. Есть ли способ отсортировать эти вкладки по годам (от максимума до минимума), а затем по месяцам? Я нашел приведенную ниже кодировку для упорядочения вкладок по алфавиту, но это не совсем дает мне желаемый результат.
function sortSheets() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetNameArray = []; var sheets = ss.getSheets(); for (var i = 0; i lt; sheets.length; i ) { sheetNameArray.push(sheets[i].getName()); } sheetNameArray.sort(); for (var j = 0; j lt; sheets.length; j ) { ss.setActiveSheet(ss.getSheetByName(sheetNameArray[j])); ss.moveActiveSheet(j 1); } }
Комментарии:
1. Я бы настоятельно посоветовал вам отказаться от нелепых архаичных имен с указанием месяца и использовать международный формат даты ISO (гггг-мм-дд) в качестве имен вкладок. Вы можете переименовать все вкладки только один раз (вручную или с помощью скрипта) и навсегда забыть о головной боли. Это прекрасный пример того, почему каждый должен использовать формат даты ISO всякий раз, когда нет очень веских причин против этого.
Ответ №1:
Раскладывание Листов
Это сортирует имена листов, меняет порядок, а затем упорядочивает их в таком порядке сортировки.
function arrangeSheets() { const ss = SpreadsheetApp.getActive(); let shts = ss.getSheets().map(sh =gt; sh.getName()); shts.sort().reverse();//Sorting by names shts.forEach((name,i) =gt;{ ss.setActiveSheet(ss.getSheetByName(name)); ss.moveActiveSheet(i 1); }); }
Я так понимаю, что вы уже можете сортировать имена листов в нужном вам порядке.
Если нет, то попробуйте это:
function arrangeSheets() { const mA = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; const ss = SpreadsheetApp.getActive(); let shts = ss.getSheets().map(sh =gt; sh.getName()); shts.sort((a, b) =gt; { let ta = a.trim().split(' '); let vA = new Date(ta[1], mA.indexOf(ta[0])).valueOf(); let tb = b.trim().split(' '); let vB = new Date(tb[1], mA.indexOf(tb[0])).valueOf(); return vB - vA;//This is descending vA - vB is ascending });//Sorting names by date values shts.forEach((name, i) =gt; { ss.setActiveSheet(ss.getSheetByName(name)); ss.moveActiveSheet(i 1); }); }
Если у вас есть другие листы, которые не имеют того же формата месяца и года, вы можете отфильтровать список shts с помощью метода фильтра, чтобы исключить их.
Комментарии:
1. Спасибо!!!!! Второй набор кода отлично работает! Это не совсем 100% (я думаю, что это связано с тем, что различные люди, работающие над этим документом, не всегда используют полный месяц или другие проблемы с именами), но это дает мне 95% результата. Я действительно ценю это!!!!!!