Ren*_*ato 26 google-apps-script
以下是我要做的事情:给定Google文档网址,我想获取文档ID以在Google云端硬盘上创建副本.我知道我可以通过一些正则表达式或替换URL来实现这一点,但由于在URL中有几种不同的表单来表示同一文档,我想找到一个通用的解决方案.
目前,这是我能想到的最好的:
function getFileIdFromUrl(url) {
try {
return getDocIdFromUrl(url);
} catch (e) {
return getSpreadsheetIdFromUrl(url);
}
}
function getDocIdFromUrl(url) {
var doc = null;
try {
doc = DocumentApp.openByUrl(url);
} catch (e) {
doc = DocumentApp.openByUrl(url + "/edit");
}
return doc.getId();
}
function getSpreadsheetIdFromUrl(url) {
var spreadsheet = null;
try {
spreadsheet = SpreadsheetApp.openByUrl(url);
} catch (e) {
spreadsheet = SpreadsheetApp.openByUrl(url + "/edit");
}
return spreadsheet.getId();
}
function copy(url) { // may throw an exception if the URL is invalid or private
var id = getFileIdFromUrl(url);
var file = DriveApp.getFileById(id);
file.makeCopy().setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
}
Run Code Online (Sandbox Code Playgroud)
问题是我的解决方案只涵盖文档和电子表格,我想对任何上传的文件做同样的事情,例如:
https://docs.google.com/file/d/0B-FYu_D7D7x4REdtRVEzVH0eU0/edit
简而言之,我想要这样的东西:
DriveApp.getFileByUrl(url).makeCopy();
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可能?
从文件URL中提取文件ID的任何安全解决方案都适合我.
谢谢
Hen*_*reu 59
DriveApp确实缺少一个getFileByUrl(以及该文件夹).您可能希望在Apps脚本问题跟踪器上打开增强请求.
但我在我的脚本上做的事情(因为这些openByUrl函数有点新),就是使用正则表达式来获取id.像这样.
function getIdFromUrl(url) { return url.match(/[-\w]{25,}/); }
Run Code Online (Sandbox Code Playgroud)
这个正则表达式适用于我尝试过的任何谷歌网址:驱动文件夹和文件的网址,Fusion表格,电子表格,文档,演示文稿等.它只是在字符串中查找"看起来像"Google键的任何内容.也就是说,任何足够大的字符串中只有(谷歌键)有效字符.
此外,即使它直接接收ID而不是URL,它也能工作.当您询问用户的链接时,这很有用,因为有些人可能会直接粘贴ID而不是网址,但它仍然有效.
小智 6
url 是这样的,文件 id 出现在这种模式“/d/XXXXXXXX/”中,几乎所有的 GoogleDrive/Docs 链接:https ://drive.google.com/file/d/0B3tB9BU9FRnpcTJmS2FoaktsQzA/view
使用下面的函数,我们可以得到 '/d/fileid/' 然后从头截断 '/d/' 并从末尾截断 '/'。
public static string getIdFromUrl(string url)
{
Regex r = new Regex(@"\/d\/(.+)\/", RegexOptions.IgnoreCase);
Match m = r.Match(url);
return m.ToString().TrimStart('/', 'd').Trim('/');
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我没有足够的声誉来评论已接受的答案,但是当驱动器 URL 包含域名且域名超过 25 个字符时,来自 Henrique G. Abreu 的已接受答案失败(刚刚发现这很难:)
否则它非常可靠,我认为是这里提供的最优雅和最强大的。
因此,扩展已接受的答案,以下正则表达式将获得至少 25 个字符长的单词字符或连字符字符串的最后一次出现,紧接其前面是不是非单词字符或连字符的字符, 后跟可选的相同类型的字符,以及最后可能出现的任何其他垃圾:
/.*[^-\w]([-\w]{25,})[^-\w]?.*/
Run Code Online (Sandbox Code Playgroud)
这失去了已接受答案的特征,即它仅在传递 ID 时才有效,但这不是我需要的用例。它适用于我测试过的文档和文件夹的所有不同类型的驱动器、文档、表格 URL。
openByUrlGoogle Apps 脚本中现在提供了一种方法。
请参阅此处的表格参考文档、此处的文档参考文档、此处的幻灯片参考文档和此处的表单参考文档。
因为你写道:
我想要获取文档 ID 以在 Google 云端硬盘上创建副本
...假设您本身不需要 ID 。通过 URL 获取工作表/文档/幻灯片/表单后,您可以复制它。
| 归档时间: |
|
| 查看次数: |
33598 次 |
| 最近记录: |