大量分配超链接到 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 脚本的可能解决方案
打开电子表格。
导航到菜单,“工具”>“脚本编辑器”。
在脚本编辑器中 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);
}
将变量 rangeNames
和 rangeLinks
替换为您想要的名称范围和您想要在其中查看超链接的范围。例如,基于您的电子表格:
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
运行 脚本。
如果您希望它是一个具有超链接的不同名称的文件。一旦您拥有所有链接,我建议您在工作表本身中使用 =HYPERLINK
功能。
说明
脚本首先获取文件名的范围并将它们放入一个数组中。然后它运行一个 for 循环,将在驱动器中搜索文件名,并 return 下载 URL。如果该值为空,则不会搜索驱动器。如果找不到值,它只会在列中显示 return“找不到文件”。
参考资料
file-iterator - 什么是 return 从 getFilesByName
编辑的
我有一个 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 脚本的可能解决方案
打开电子表格。
导航到菜单,“工具”>“脚本编辑器”。
在脚本编辑器中 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); }
将变量
rangeNames
和rangeLinks
替换为您想要的名称范围和您想要在其中查看超链接的范围。例如,基于您的电子表格: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
运行 脚本。
如果您希望它是一个具有超链接的不同名称的文件。一旦您拥有所有链接,我建议您在工作表本身中使用
=HYPERLINK
功能。
说明
脚本首先获取文件名的范围并将它们放入一个数组中。然后它运行一个 for 循环,将在驱动器中搜索文件名,并 return 下载 URL。如果该值为空,则不会搜索驱动器。如果找不到值,它只会在列中显示 return“找不到文件”。
参考资料
file-iterator - 什么是 return 从 getFilesByName