列出网页上指定文件夹中的Google云端硬盘文件

时间:2016-03-14 03:09:18

标签: javascript google-apps-script google-drive-api

我正在寻找一种方法来列出特定google驱动器文件夹中的所有文件,这些文件也会自动更新列表,让每个人都可以查看。我发现有相当数量的文章会创建一个电子表格来列出它们,但它们不会自行更新。我只能理解我试图修改其他一些代码的JavaScript,但无济于事。这就是我所做的。

我创建了Google Apps脚本文件

function doGet(e){
return HtmlService.createHtmlOutputFromFile('list.html');}

list.html

<!DOCTYPE html>
<html>
  <head>
  <script type="text/javascript">
    var dir = "SpinFest2016 KPDS Clips"

    function listFilesInFolder(dir) {

      var folder = DriveApp.getFoldersByName(dir).next();
      var contents = folder.getFiles();
      var file;
      var name = [];
      var date = [];
      var desc = [];

      for (var i = 0; i < contents.length; i++) {

      file = contents[i];

      name[i] = file.getName();
      date[i] = file.getDateCreated();
      desc[i] = file.getDescription();

      };
    };
  </script>
  </head>
      <table style ="width: 100%">
      <tr>
          <th>이름</th>
          <th>제출일</th>
          <th>비고</th>
      <tr>
          <td><p id="name"></p></td>
          <td><p id="date"></p></td>
          <td><p id="desc"></p></td>
      </tr>
      <script type="text/javascript">
          document.getElementById("name").innerHTML = name;
      </script>

      </table>
  </body>
</html>

我试图首先列出文件名,但它从未奏效,我无法弄清楚错误是什么。如果你能指出我哪个部分是错的以及我必须做什么,我非常感谢你的帮助。如果还有其他更好的方法(不仅是谷歌应用程序脚本,还有其他显示文件列表的方式),这些方式符合以下条件,我非常感谢。

  • 列出谷歌驱动器中的文件名
  • 任何有链接的人都可以查看列表
  • 自动列出更新(无论是定期更新还是发生任何更改)

2 个答案:

答案 0 :(得分:1)

getFiles()将返回FileIterator,它可能没有.length属性。将循环更改为while循环并检查迭代器hasNext是否为true,这样它将迭代。此外,尝试更改将项目推送到阵列的方式。请参阅修改后的代码段,希望这有效。

while (contents.hasNext()){

    file = contents.next();

    name.push(file.getName());
    date.push(file.getDateCreated());
    desc.push(file.getDescription());

};

在此之后,你如何展示它将取决于你。

答案 1 :(得分:0)

如上所述,您的doGet为Web浏览器提供了一个HTML页面,其中嵌入了一些JS代码,浏览器将尝试执行该代码。并且失败,因为网络浏览器不知道DriveApp;它可以运行JavaScript,而不是Apps脚本。

doGet可以execute Apps Script code in scriplets嵌入在由folder.getFiles()提供的页面中,但语法需要一段时间才能习惯。

对于像你这样的简单页面,我只想在doGet函数中创建所有HTML,并提供服务。看看我的例子。

您的代码还有一个问题:function doGet(e) { var template = '<table style ="width: 100%"><tr><th>name</th><th>Date</th><th>Description</th></tr>APPS_SCRIPT_CONTENT</table>'; var dir = 'SpinFest2016 KPDS Clips'; var folder = DriveApp.getFoldersByName(dir).next(); var contents = folder.getFiles(); var file, name, date, desc, list = []; while (contents.hasNext()) { file = contents.next(); name = file.getName(); date = file.getDateCreated(); desc = file.getDescription(); list.push('<tr><td>' + name + '</td><td>' + date + '</td><td>' + desc + '</td></tr>'); } var output = HtmlService.createHtmlOutput(template.replace('APPS_SCRIPT_CONTENT', list.join(''))); return output.setTitle('Directory List').setSandboxMode(HtmlService.SandboxMode.IFRAME); } 返回file iterator,而不是数组。这是您使用hasNext和next方法循环的内容,如下所示。

let

这将使用目录的当前快照提供静态HTML文件。如果用户重新加载,他们将获得一个可能更新鲜的副本。如果目录内容被更改,文件将不会自行更新;我觉得这个平台上甚至不可能。使用运行Apps脚本代码的scriplet,可以尝试定期更新,但这似乎不太实际:为什么要浪费你的Apps脚本执行时间配额打开你的网页并去散步的用户?