Есть ли способ отсортировать эту функцию скриптов Google в числовом / обратном направлении? - PullRequest
0 голосов
/ 13 февраля 2020

Вот сценарий, который я использую, чтобы вытянуть все имена листов Google Sheet Document в список на лицевой стороне листа. Это работает; Тем не менее, есть ли способ отсортировать это противоположным образом? У меня есть листы, названные по дате, с самой старой датой как самой дальней и самой новой, ближайшей к лицевой стороне. Так что сначала сортируется самая новая дата, но я бы хотел, чтобы она сначала отсортировалась по самой старой дате. Кроме того, есть ли способ сделать эту функцию динамической c, чтобы она обновлялась при добавлении новых листов или если имена листов меняются?

function sheetnames() {
  var out = new Array()
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();


for (var i=0 ; i<sheets.length ; i++) {
  Logger.log(String(sheets[i].getSheetId()));
 // var sheetId = sheets.getSheetId()
  out.push( [ sheets[i].getName() ] ) 
}

return out 
}

Ответы [ 4 ]

0 голосов
/ 15 февраля 2020

Извините, что ответил на неправильный вопрос.

0 голосов
/ 13 февраля 2020

Использование Array.reverse () :

function sheetnamesreverse() {
  return SpreadsheetApp.getActive()
    .getSheets()
    .map(s => [s.getName()])
    .reverse();
}
0 голосов
/ 14 февраля 2020

Вы можете использовать onChange Устанавливаемый триггер , но примите во внимание его Ограничения . Таким образом, код, который я вам предоставлю, будет запускаться каждый раз, когда вы добавляете новый лист или редактируете имя листа:

// Installable Trigger
function onChange() {
  var dates = sheetNames();
  Logger.log(dates);
}

function sheetNames(){
  try{
    // Get all sheets and then return
    return SpreadsheetApp.getActiveSpreadsheet()
             .getSheets()
             // Get a new array only with the sheet names
             .map(function(sheet){ return sheet.getName() })
             // Sort the array from the oldest date to the newest date
             .sort(
               function (sheet1, sheet2){
                 return new Date(sheet2) - new Date(sheet1);
               });
  } catch(e){
    Logger.log("Not a date");
    return e;
  }
}

Теперь для настройки устанавливаемого триггера сделайте следующее :

1) Go в ваш проект Apps Script

2) Нажмите Edit-> Триггеры текущего проекта

3) Нажмите «+ Add Trigger»

4) Выберите:

Выберите, какую функцию запустить ->

Выберите источник события-> Из электронной таблицы

Выберите тип события -> При изменении

5) Нажмите Сохранить

0 голосов
/ 13 февраля 2020

Попробуйте:

function SHEETLIST() {
try {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  var out = new Array( sheets.length+1 ) ;
  out[0] = [ "♥♥" , "#GID" ];
  for (var i = 1 ; i < sheets.length+1 ; i++ ) out[i] = 
  [sheets[i-1].getName() , sheets[i-1].getSheetId() ];
  return out
}
catch( err ) {
  return "#ERROR!" }}

и формула:

=ARRAYFORMULA(QUERY(IFERROR(SPLIT(INDEX(SHEETLIST(),,1)&"♦"&ROW(A:A), "♦")), 
 "select Col1 where Col1 <> '♥♥' order by Col2 desc", 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...