批量更新Google云端硬盘中的文件内的链接?

时间:2017-05-18 12:54:38

标签: url google-apps-script google-drive-api google-docs google-slides

我们使用Google Drive(GAFE)来准备和展示教学/培训材料。我们希望维护过去迭代的存档版本,然后为每个连续的培训会话处理新的副本。

我已经成功制作了我们的培训文件夹的副本(使用ericyd的gdrive-copy),我们很乐意为此工作,但是......这些文件交叉链接很多。例如,幻灯片将链接到与该课程相关的文档讲义和PDF作业。当我复制整个文件夹结构时,复制过的文件,但链接仍然都链接到原始文件,实际上我们想要的是将它们链接到各自的副本。

这很有意义 - 显然,当您复制文件时,通常不希望同时更改其内容。但是,当您对整个文件夹进行存档时,理想情况下您还希望文件中的链接也能更新。

我可以使用每个“原始和复制”对的文件ID编译电子表格。有没有办法遍历文件夹中的所有Google文档/表格/幻灯片,并用电子表格文件中的原始网址替换各自的副本网址?

对于Google Apps脚本,我几乎是初学者,所以虽然我找到Get All Links in a Document并且我猜它会成为答案的一部分,但我不知道该去哪里。

(顺便说一句,如果有不同的方式来解决这三个问题,那么自动修复幻灯片中的链接将是最有帮助的,因为大部分都是这样的)

1 个答案:

答案 0 :(得分:0)

我知道这是一个比较老的话题,但是最近我遇到了需要解决的类似情况。在我的搜索中,这是我可以找到的唯一参考,指的是由于重复而导致的交叉链接。不幸的是,我无法提出一种纯粹的自动化解决方案,但是通过一些独创性,我能够减少更新超链接以引用重复文件而不是原始文件所需的步骤。

首先,我借用了一些在网上找到的脚本代码,以生成Google云端硬盘文件夹中的文件及其URL的列表。我将在下面发布代码。这会生成一个名为“ URL LIST”的新Google表格(您可以根据需要在脚本中更改名称),生成后,您需要在Google云端硬盘中的最近列表中查找并移至包含复制的文件夹文件和表格。

接下来,在Google表格中,我有指向文档的超链接,我创建了一个也称为URL LIST的附加选项卡,并在A1中添加了IMPORTRANGE()以导入URL LIST内容。一旦完成所有这些操作,您只需要为您制作的每个副本更新一个引用,从而大大减少了您需要进行的更新次数,即IMPORTRANGE()指向特定的URL,因此每个新生成的URL LIST都会有一个新URL,包含超链接和IMPORTRANGE()的复制文档将需要指向该URL。希望这是有道理的。

接下来,您的超链接将需要一个= HYPERLINK(VLOOKUP(A1,'URL LIST'!$ A $ 1:$ B $ 10,2,FALSE)这样的公式,以获取导入的URL。请务必确保您表示查找范围未排序或为FALSE,因为脚本随URL弹出文档列表的顺序可能会有所变化,具体取决于运行脚本时文件夹的排序方式,并确保您不需要对列表进行排序,然后可以将公式复制到需要超链接的每个单元格中。

同样重要的是,您的VLOOKUP()搜索关键字与您在URL列表中列出的关键字完全相同。

此方法使我每次复制时将更新超链接的步骤数从9个步骤减少到1个更新IMPORTRANGE()的步骤。

希望这对您或其他人有帮助!

将以下脚本复制并粘贴到脚本编辑器中:

// replace your-folder below with the folder name for which you want a listing
function listFolderContents() {
  var foldername = 'your-folder';
  var folderlisting = 'URL LIST ';

  var folders = DriveApp.getFoldersByName(foldername)
  var folder = folders.next();
  var contents = folder.getFiles();

  var ss = SpreadsheetApp.create(folderlisting);
  var sheet = ss.getActiveSheet();
  sheet.appendRow( ['name', 'link'] );

  var file;
  var name;
  var link;
  var row;
  while(contents.hasNext()) {
    file = contents.next();
    name = file.getName();
    link = file.getUrl();
    sheet.appendRow( [name, link] );     
  }  
};