Как я могу Driveapp получить файлы в папке в алфавитном порядке с помощью сценариев Google - PullRequest
0 голосов
/ 05 марта 2019

Я получаю файлы из папки на диске Google, а затем пытаюсь вставить ссылку на них в электронную таблицу.Проблема в файлах, использующих var ezIter = folderez.getFiles ();похоже, возвращаются в случайном порядке.Я бы хотел, чтобы они были в алфавитном порядке.Это возможно?

Вот мой код в настоящее время.Это работает хорошо, но это ссылки на файлы не в порядке, и это все портит.

function getFiles() {

  var dApp = DriveApp;
  var vfolder = dApp.getFoldersByName("video").next();
  var yearfolder = vfolder.getFoldersByName("2018").next();
  var gamefolder = yearfolder.getFoldersByName("game1").next();
  var folderez = gamefolder.getFoldersByName("ez").next();
  var ezIter = folderez.getFiles();
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(yearfolder+gamefolder);

  var i = 2;

  while (ezIter.hasNext()) {
    var file = ezIter.next();
    var name = file.getName();
    var url = file.getUrl();
    range = 'AC'+(i);
    var filename = 'ezvideo'+(i-1);
    var semi = ";";  
    var hyp = "=hyperlink(\"";
    var quot = "\"";
    var clos = ")";
    var title = hyp  + url + quot + semi + quot + filename + quot + clos;  // str='=hyperlink("' + f.getUrl() + '","' + f.getName() + '")';
    ss.getRange(range).setValue(title);   
    i++;
}

1 Ответ

0 голосов
/ 05 марта 2019

Я не знаю, как работает этот API, но это может помочь вам сортировать файлы.

Сначала полностью удалите цикл while и вставьте вместо него следующее:

var files = [];

// creates an array of file objects
while (ezIter.hasNext()) {
    files.push(ezIter.next());
}

// sorts the files array by file names alphabetically
files = files.sort(function(a, b){
    var aName = a.getName().toUpperCase();
    var bName = b.getName().toUpperCase();

    return aName.localeCompare(bName);
});

files.forEach(function(file){
    var name = file.getName();
    var url = file.getUrl();
    range = 'AC'+(i);
    var filename = 'ezvideo'+(i-1);
    var semi = ";";  
    var hyp = "=hyperlink(\"";
    var quot = "\"";
    var clos = ")";
    var title = hyp  + url + quot + semi + quot + filename + quot + clos;  // str='=hyperlink("' + f.getUrl() + '","' + f.getName() + '")';
    ss.getRange(range).setValue(title);   
    i++;
});

ОБНОВЛЕНИЕ: Исходя из предложений по оптимизации, вы можете вызвать getName один раз для каждого файла, например так:

var files = [];

// creates an array of file objects
while (ezIter.hasNext()) {
    var file = ezIter.next();
    files.push({name: file.getName(), url: file.getUrl()});
}

// sorts the files array by file names alphabetically
files = files.sort(function(a, b){
    var aName = a.name.toUpperCase();
    var bName = b.name.toUpperCase();

    return aName.localeCompare(bName);
});

files.forEach(function(file){
    var name = file.name;
    var url = file.url;
    range = 'AC'+(i);
    var filename = 'ezvideo'+(i-1);
    var semi = ";";  
    var hyp = "=hyperlink(\"";
    var quot = "\"";
    var clos = ")";
    var title = hyp  + url + quot + semi + quot + filename + quot + clos;  // str='=hyperlink("' + f.getUrl() + '","' + f.getName() + '")';
    ss.getRange(range).setValue(title);   
    i++;
});
...