Изменение порядка листов Google Sheet по дате - PullRequest
1 голос
/ 11 декабря 2019

У меня есть книга Google Sheets с несколькими листами, названными по дате. Я пытаюсь использовать скрипт Служб Google, чтобы: 1) переупорядочить эти листы в обратном хронологическом порядке, и 2) затем переместить все листы с датами в будущем в конец рабочей книги, поэтому первый лист всегда будет с самым последнимпрошлая дата.

Шаг 1 отлично работает со следующим кодом:

function sortGoogleSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Store all the worksheets in this array
  var sheetNameArray = [];
  var sheets = ss.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    sheetNameArray.push(sheets[i].getName());
  }

  sheetNameArray.sort().reverse();

  // Reorder the sheets.
  for( var j = 0; j < sheets.length; j++ ) {
    ss.setActiveSheet(ss.getSheetByName(sheetNameArray[j]));
    ss.moveActiveSheet(j + 1);
  }
}

Но шаг 2 не работает, чтобы затем переместить листы с будущей датой в конец. Ошибка не генерируется, но порядок листов не изменяется. «FutureSheetIDs» - это именованный диапазон из одного столбца, содержащий идентификаторы листов (например, 938739529, 532578283 и т. Д.) Листов с датами> сегодня, т. Е. Для перемещения в конец рабочей книги.

function resortFutureSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var pos = ss.getNumSheets();
  var FutureSheets = ss.getRangeByName("FutureSheetIDs");
  for(var s=0 ; s < FutureSheets.length ; s++){
    var sh = ss.setActiveSheet(ss.getSheetByID(FutureSheets[s]));
    SpreadsheetApp.flush();
    Utilities.sleep(200);
    ss.moveActiveSheet(pos);
    SpreadsheetApp.flush();
    Utilities.sleep(200);
  }
}

Любое руководство о том, почему шаг 2 не работает, как ожидалось, будет высоко ценится. Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2019

Попробуйте использовать Sheets API , встроенный в Apps Script, как Advanced Sheets Service .

. Вы можете получить и изменить ID листа и индекс листа , причем, как указано в документации :

Индекс листа в электронной таблице. При добавлении или обновлении свойств листа, если это поле исключено, тогда лист добавляется или перемещается в конец списка листов. При обновлении индексов листов или вставке листов перемещение учитывается в индексах «до перемещения». Например, если бы было 3 листа (S1, S2, S3), чтобы переместить S1 впереди S2, индекс должен был бы быть установлен на 2. Запрос на обновление индекса листа игнорируется, если запрошенный индекс идентичен текущему листу. index или, если запрошенный новый индекс равен индексу текущего листа + 1.

Таким образом, для вашего запроса было бы полезно изменить индекс листа, что вы можете сделать с помощью

После включения Advanced Sheets Service вы можете изменить индекс (= положение) листа следующим образом:

function myFunction() { 
 var ss=SpreadsheetApp.getActiveSpreadsheet(); 
 var FutureSheets=ss.getRangeByName("FutureSheets"); 
 var FutureIds=FutureSheets.getValues();
 var spreadsheetId=ss.getId();
 var sheets=ss.getSheets();
 for(s=0;s<FutureIds.length;s++)  { 
    if(FutureIds[s][0]==0){
      break;
    }else{
      var resource = {
        "requests": [
          {
            "updateSheetProperties": {
              "fields": "index",
              "properties": {
              "sheetId": FutureIds[s][0],
              "index": sheets.length
              }
            }
          }
        ]
      }
    Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId)
    }
  }
}
0 голосов
/ 12 декабря 2019

Это кажется лучшим рабочим решением, хотя и довольно темпераментным:

  function resortFutureSheets(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var pos = ss.getNumSheets();
  var FutureSheets = ss.getRangeByName("FutureSheetNames");
  var FutureSheetsArray = FutureSheets.getValues();
  for(var s = 0 ; s < FutureSheets.length; s++) {
    ss.setActiveSheet(ss.getSheetByName(FutureSheetsArray[s]));
    SpreadsheetApp.flush();
    Utilities.sleep(200);
    ss.moveActiveSheet(pos);
    SpreadsheetApp.flush();
    Utilities.sleep(200);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...