从 URL 的列表中获取文件名 - Google 驱动器
Get File Name from list of URL's - Google Drive
所以我需要从电子表格中的 Google 驱动器 URL 范围中获取文件名列表。浏览网络,我发现了下面的代码。它有效,但仅适用于旧样式 url,我听说 Google 已于 2021 年 9 月更改。
请注意,链接功能不全,请替换为真实链接以查看!
旧样式是:
https://drive.google.com/file/d/1GMUwYxZxsNpLiaYOiVMBwl41LpreQ-fc/view?usp=sharing
这从下面的代码中可以正常工作。
不过我想要的是两件事。
它应该处理几列的范围,当前读取 AE2:AE
,并在 AM2:AM
上打印出来。我想要的是遍历范围:AE2:AL
并打印出来:AM2:AT
其次,它还应该处理更新的形式 urls:
https://drive.google.com/file/d/0B9EZQqsLDEqDUGlsdy1oVEtETGs/view?usp=sharing&resourcekey=0-h7HOcxayPaHJ5r6dAAslVQ
当前代码:
function getNames() {
var activeRange = SpreadsheetApp.getActiveSheet().getDataRange();
var height = activeRange.getHeight();
var links = SpreadsheetApp.getActiveSheet()
.getRange("AE2:AE" + height)
.getValues();
var nameValues = [];
links.forEach((row) => {
try {
var link = row[0];
var fileID = getIdFromLink(link);
var name = DriveApp.getFileById(fileID).getName();
nameValues.push([name]);
} catch (e) {
nameValues.push(["NO NAME FOUND"]);
}
});
var nameRange = SpreadsheetApp.getActiveSheet().getRange("AM2:AM" + height);
nameRange.setValues(nameValues);
}
function getIdFromLink(link) {
var regex = new RegExp(
/(?<=https:\/\/drive\.google\.com\/file\/d\/)(.+)(?=\/)/
);
return regex.exec(link)[0];
}
应该如何修改上面的代码才能实现我想要的功能。抱歉,我尝试了几个 if/else 语句,但我的 Javascript 知识非常有限。
任何帮助将不胜感激。
当前“屏幕截图”显示:
(1) - 旧式 url - 正确选取文件名 (2)
(3) - 新样式 url - 不提取文件名 (4)
您的 getIdFromLink()
功能应该可以正常工作,只要文件没有以需要 resource key 的方式共享。
要使用资源密钥,请使用 DriveApp.getFileByIdAndResourceKey(),如下所示:
function getFileNamesByLink() {
const sheet = SpreadsheetApp.getActiveSheet();
const sourceRange = sheet.getRange('AE2:AL');
const targetRange = sheet.getRange('AM2');
const fileNames = sourceRange.getValues()
.map(row => row.map(link => getFileNameFromLink_(link)));
targetRange
.offset(0, 0, fileNames.length, fileNames[0].length)
.setValues(fileNames);
}
function getFileNameFromLink_(link) {
if (!link) {
return null;
}
const fileId = getIdFromLink_(link);
if (!fileId) {
return NaN;
}
let file;
try {
file = DriveApp.getFileById(fileId);
} catch (error) {
try {
file = DriveApp.getFileByIdAndResourceKey(fileId, getResourceKeyFromLink_(link));
} catch (error) {
return NaN;
}
}
return file.getName();
}
function getIdFromLink_(link) {
const match = String(link).match(/file\/d\/([-\w]+)/i);
return match ? match[1] : null;
}
function getResourceKeyFromLink_(link) {
const match = String(link).match(/resourcekey=([-\w]+)/i);
return match ? match[1] : null;
}
请注意,如果您有数千个链接,脚本可能会超时。如果发生这种情况,请逐步处理链接,或者查看 Advanced Drive Service 是否适合您。
所以我需要从电子表格中的 Google 驱动器 URL 范围中获取文件名列表。浏览网络,我发现了下面的代码。它有效,但仅适用于旧样式 url,我听说 Google 已于 2021 年 9 月更改。 请注意,链接功能不全,请替换为真实链接以查看!
旧样式是:
https://drive.google.com/file/d/1GMUwYxZxsNpLiaYOiVMBwl41LpreQ-fc/view?usp=sharing
这从下面的代码中可以正常工作。
不过我想要的是两件事。
它应该处理几列的范围,当前读取 AE2:AE
,并在 AM2:AM
上打印出来。我想要的是遍历范围:AE2:AL
并打印出来:AM2:AT
其次,它还应该处理更新的形式 urls:
https://drive.google.com/file/d/0B9EZQqsLDEqDUGlsdy1oVEtETGs/view?usp=sharing&resourcekey=0-h7HOcxayPaHJ5r6dAAslVQ
当前代码:
function getNames() {
var activeRange = SpreadsheetApp.getActiveSheet().getDataRange();
var height = activeRange.getHeight();
var links = SpreadsheetApp.getActiveSheet()
.getRange("AE2:AE" + height)
.getValues();
var nameValues = [];
links.forEach((row) => {
try {
var link = row[0];
var fileID = getIdFromLink(link);
var name = DriveApp.getFileById(fileID).getName();
nameValues.push([name]);
} catch (e) {
nameValues.push(["NO NAME FOUND"]);
}
});
var nameRange = SpreadsheetApp.getActiveSheet().getRange("AM2:AM" + height);
nameRange.setValues(nameValues);
}
function getIdFromLink(link) {
var regex = new RegExp(
/(?<=https:\/\/drive\.google\.com\/file\/d\/)(.+)(?=\/)/
);
return regex.exec(link)[0];
}
应该如何修改上面的代码才能实现我想要的功能。抱歉,我尝试了几个 if/else 语句,但我的 Javascript 知识非常有限。
任何帮助将不胜感激。
当前“屏幕截图”显示:
(1) - 旧式 url - 正确选取文件名 (2)
(3) - 新样式 url - 不提取文件名 (4)
您的 getIdFromLink()
功能应该可以正常工作,只要文件没有以需要 resource key 的方式共享。
要使用资源密钥,请使用 DriveApp.getFileByIdAndResourceKey(),如下所示:
function getFileNamesByLink() {
const sheet = SpreadsheetApp.getActiveSheet();
const sourceRange = sheet.getRange('AE2:AL');
const targetRange = sheet.getRange('AM2');
const fileNames = sourceRange.getValues()
.map(row => row.map(link => getFileNameFromLink_(link)));
targetRange
.offset(0, 0, fileNames.length, fileNames[0].length)
.setValues(fileNames);
}
function getFileNameFromLink_(link) {
if (!link) {
return null;
}
const fileId = getIdFromLink_(link);
if (!fileId) {
return NaN;
}
let file;
try {
file = DriveApp.getFileById(fileId);
} catch (error) {
try {
file = DriveApp.getFileByIdAndResourceKey(fileId, getResourceKeyFromLink_(link));
} catch (error) {
return NaN;
}
}
return file.getName();
}
function getIdFromLink_(link) {
const match = String(link).match(/file\/d\/([-\w]+)/i);
return match ? match[1] : null;
}
function getResourceKeyFromLink_(link) {
const match = String(link).match(/resourcekey=([-\w]+)/i);
return match ? match[1] : null;
}
请注意,如果您有数千个链接,脚本可能会超时。如果发生这种情况,请逐步处理链接,或者查看 Advanced Drive Service 是否适合您。