我的朋友向我分享了他的Google工作表,表格中包含图片(链接)。我如何制作此工作表的副本并使所有图像链接都位于本地,所以我希望图像自动复制到我的本地google驱动器中(因此,如果他将来删除其图像文件,链接不会断开) 。现在,如果我复制此文档,则它仍链接到原始图像源。
怎么可能?当然,我不想手动从链接中一一复制它们。有什么更好,更快的方法吗?
https://docs.google.com/spreadsheets/d/1TkXwAd8rKbjnGfYEJVaOYBJwCZ7G7YfuSvmcDE6g8No/edit?usp=sharing
答案 0 :(得分:0)
OP希望从超链接公式中提取图像URL,并将图像副本保存到自己的Google云端硬盘帐户中。
此答案结合了StackOverflow上的一些先例元素。
由于图像元数据位于公式中,因此代码使用getFormulas()
方法而不是“常规” getValues()
。没有公式的单元格是空字符串;因此是测试if (formula.length !=0){
。
获取不带扩展名的文件名:REGEX: Capture Filename from URL without file extension。具有讽刺意味的是,此先例不使用正则表达式,而是查找last /和last的位置。使用lastIndexOf并获得这些点之间的子字符串。请注意,此解决方案对具有多个句点的文件名失败,尽管该方案还有另一种解决方案。
从包含正则表达式和Javascript match
的URL Getting a Google Spreadsheet Cell's Image URL中获取文件名。
将文件保存到Google云端硬盘:Need sheets script to save img to drive,这是一种用于保存文件的简单且优雅的解决方案。
将文件保存到Google云端硬盘:When copying files using Apps Script from one folder to another any “Apps Script” files being copied end up in MyDrive not the specified folder - why?解释了为什么需要API才能将文件写入“我的云端硬盘”。
注意:要使用此脚本,请在高级Google服务中启用Drive API v2
function so5811567402() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheetName = "Table";
var sh = ss.getSheetByName(sheetName);
var rg=sh.getDataRange();
var lastColumn = sh.getLastColumn();
var lastRow = sh.getLastRow();
var formulas = rg.getFormulas();
for (var i in formulas) {
for (var j in formulas[i]) {
var formula = formulas[i][j];
if (formula.length !=0){
var regex = /image\("(.*)"/i;
var matches = formula.match(regex);
var imgurl = matches[1];
var filename = imgurl.substring(imgurl.lastIndexOf("/") + 1, imgurl.lastIndexOf("."));
//Logger.log(filename);
var image = UrlFetchApp.fetch(imgurl).getBlob().getAs('image/jpeg').setName(filename);
var FolderId = "Folder ID goes here";
var folder = DriveApp.getFolderById(FolderId);
var file = DriveApp.createFile(image);
Drive.Files.update({"parents": [{"id": folder.getId()}]}, file.getId());
}
}
}
}