Есть ли способ отсортировать вкладки Google Листов по последней части имени вкладки?

#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% результата. Я действительно ценю это!!!!!!