从Google Apps脚本上的URL获取文件ID的最简单方法

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而不是网址,但它仍然有效.

  • 使用[aquadeep建议的正则表达式](http://stackoverflow.com/a/31201136/1404066)不太可能进行不必要的匹配.然后使用(组)仅提取正则表达式的ID部分:url.match(/\/ d\/(.{25,})\ //)[1]; (2认同)

小智 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。


ADW*_*ADW 5

openByUrlGoogle Apps 脚本中现在提供了一种方法。

请参阅此处的表格参考文档、此处的文档参考文档此处的幻灯片参考文档此处的表单参考文档

因为你写道:

我想要获取文档 ID 以在 Google 云端硬盘上创建副本

...假设您本身不需要 ID 。通过 URL 获取工作表/文档/幻灯片/表单后,您可以复制它。