大量分配超链接到 Google 个工作表/Excel 个单元格

Mass assigning hyperlinks to Google Sheets / Excel cells

我有一个 3 列 excel 文件(名称/时间/link)。 name为学院名称,time为文档上传日期,link为hyperlinked“test.pdf”,例如。现在第 3 列包含 6000 个应该可点击的文本单元格,例如,我会将我所有的文档上传到 AWS S3 或 Google 驱动器,然后将 links 放入细胞。单元格值和文件名相同。 (test.pdf 单元格 = test.pdf 可下载文件)。

我想知道的是如何将所有这些 link 分配给那些单元格,而无需手动 copy/pasting 上传文件 link 到单元格?它有 6000 多条记录,这将花费大量时间。当然,文件是在 S3 还是 GD 上都没有关系,我想我可以将它们上传到任何使这成为可能的服务。

TLDR 我想将我所有的 6000 个单元超级link 转换为人们可以下载的文档,但除了“手动执行”之外我找不到任何自动化解决方案。

PS: 文件夹结构如下

学院 1 个文件夹(10 个 pdf 文档)

学院 2 文件夹(10 个 pdf 文档)

...

学院600个文件夹(10个pdf文档)

例如,如果学院名称是 Oxford,则该文件夹中的第一个文档将是 P1OU(第 1 期牛津大学,一直到 10 个文档)

这是电子表格:

https://docs.google.com/spreadsheets/d/1kOWFQSMTYh0RJveDMqTXx_oeL_ueXkeKCBnHmTWk5ZA/edit?usp=sharing

假设

下面的解决方案假设了一些事情:

  • 您已将文件上传到云端硬盘。
  • 电子表格中的文件名与云端硬盘中的文件名完全一致。
  • 在你的整个驱动器没有其他同名文件

Apps 脚本的可能解决方案

  1. 打开电子表格。

  2. 导航到菜单,“工具”>“脚本编辑器”。

  3. 在脚本编辑器中 window 将函数替换为:

    function getLinks() {
    
      var rangeNames = "C2:C10";
      var rangeLinks = "D2:D10";
    
      var fileNames = SpreadsheetApp.getActiveSheet().getRange(rangeNames).getValues();
    
      fileNames.forEach(function(row, i) {
        if (row[0] != "") {
          try {
            var fileFound = DriveApp.getFilesByName(row[0]).next();
            fileNames[i]=[fileFound.getDownloadUrl()];
          } catch(e){
            fileNames[i] = ["file not found"];
          };
        };
      });
    
      SpreadsheetApp.getActiveSheet().getRange(rangeLinks).setValues(fileNames);
    }
    
  4. 将变量 rangeNamesrangeLinks 替换为您想要的名称范围和您想要在其中查看超链接的范围。例如,基于您的电子表格:

    var rangeNames = "C2:C50";
    var rangeLinks = "D2:D50";
    

Warning For 6000 lines this will probably take a long time and may time-out (6 min max) or you may run into a quota issue (though I think for 6000 requests it should be fine). You will likely have to break it up into batches. See more about that here

  1. 运行 脚本。

  2. 如果您希望它是一个具有超链接的不同名称的文件。一旦您拥有所有链接,我建议您在工作表本身中使用 =HYPERLINK 功能。

说明

脚本首先获取文件名的范围并将它们放入一个数组中。然后它运行一个 for 循环,将在驱动器中搜索文件名,并 return 下载 URL。如果该值为空,则不会搜索驱动器。如果找不到值,它只会在列中显示 return“找不到文件”。

参考资料

DriveApp.getFilesByName()

file-iterator - 什么是 return 从 getFilesByName

编辑的

getDownloadUrl()