使用javascript在锚标签中对alpha链接进行alpha排序

时间:2017-02-15 01:15:00

标签: javascript html sorting google-apps-script hyperlink

好的 - 这个涉及javascript和Google Apps脚本。问题出在javascript上。

我正在使用以下代码创建一个指向Google云端硬盘文件夹中文件的链接列表:

function doGet(e) {
  var template = '<table style =""><tr><th>name</th></tr>APPS_SCRIPT_CONTENT</table>';
  var dir = 'MY_FOLDER_ID';
  var folder = DriveApp.getFolderById(dir);
  var contents = folder.getFiles();
  var filelist = []; 
  var file, name, url = []; 
  while (contents.hasNext()) {
   file = contents.next();
   name = file.getName();
   url = file.getUrl();
   filelist = filelist.concat('<tr><td><a id="' + name + '" href="' + url + '">' + name + '</a></td></tr>');
  }
}

这会生成一个我想要进行alpha排序的数组文件列表。我想根据文件的名称对它们进行排序(在ID中将它放在凌乱的谷歌链接之前)。

filelist.sort();
var output = HtmlService.createHtmlOutput(template.replace('APPS_SCRIPT_CONTENT', filelist));
return output.setTitle('Directory List').setSandboxMode(HtmlService.SandboxMode.IFRAME);

对于四个示例文件,我得到以下输出:

,,,
name
Sample 2
Zzz file
aaa file
sample 1

有几个问题: 1:它们没有按字母排序。实际上,它们按上次修改日期排序。如果我修改文件并重新运行脚本,修改后的文件将跳转到顶部。 2:我不知道名字&#39;之上的三个逗号在哪里?来自。

接下来我该怎么办?

2 个答案:

答案 0 :(得分:0)

由于文件夹用于getFiles,它是一个文件集合,你可以使用underscore.js基本上将它们排序为json数据,如下所示:

function doGet(e) {

  var template = '<table style =""><tr><th>name</th></tr>APPS_SCRIPT_CONTENT</table>';
  var dir = 'MY_FOLDER_ID';

  var files = [{name: 'Sample 2', url:''},{name: 'zzz file', url:''},{name: 'aaa file', url:''},{name: 'Sample 1', url:''}];

  var sortedArray = _.sortBy(files, 'name');

  var filelist = [];

  _.each(sortedArray, function(file){
      filelist += '<tr><td><a id="' + file.name + '" href="' + file.url + '">' + file.name + '</a></td></tr>'
  });

}

Underscore非常擅长排序数据集。如果您不确定文件夹的结构,可以使用console.log(JSON.stringify(folder)),它将显示文件夹的JSON结构。

以下是一个plunker片段:http://plnkr.co/edit/EDO3DWVOraRb5Y02XOvh?p=preview

答案 1 :(得分:0)

这将解决您的逗号困境,您将获得额外的逗号,因为您将数组转换为字符串:

template.replace('APPS_SCRIPT_CONTENT', filelist)

它基本上连接逗号的数组对象,给你一个这样的输出:

<table style =""><tr><th>name</th></tr><tr><td>Filename</td></tr>,<tr><td>Filename</td></tr>,<tr><td>Filename</td></tr>,<tr><td>Filename</td></tr>,<tr><td>Filename</td></tr>,

正如您所看到的,所有额外的逗号都不在tr或td标记内。这会将它们推出桌面并将其显示在顶部。替换的正确语法是:

template.replace('APPS_SCRIPT_CONTENT', filelist.join(""))

给出这个:

<table style =""><tr><th>name</th></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>Filename</td></tr><tr><td>

修改 您的排序正在排除。由于您具有小写和大写文件名,因此它首先对大写字母进行排序,然后对小写字母进行排序。

我修改了代码以帮助排序更好:

while (contents.hasNext()) {
    file = contents.next();

    name =file.getName()
    idName = name.toUpperCase() // Use upper case for ID and it should sort correctly.
    url = file.getUrl();

    filelist = filelist.concat('<tr><td><a id="' + idName + '" href="' + url + '">' + name + '</a></td></tr>');
} 
filelist.sort()

希望有所帮助,让我知道!