42

これが私がやろうとしていることです: Google ドキュメントの URL を指定して、ドキュメント 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);
}

問題は、私のソリューションがドキュメントとスプレッドシートのみをカバーしていることです。たとえば、アップロードされたファイルで同じことをしたいと思います。

https://docs.google.com/file/d/0B-FYu_D7D7x4REdtRVEzVH0eU0/edit

要するに、私はそのようなものが欲しかった:

DriveApp.getFileByUrl(url).makeCopy();

それが可能かどうか誰かが知っていますか?

ファイル URL からファイル ID を抽出する安全なソリューションは、私にも適しています。

ありがとう

4

11 に答える 11

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('/');
}
于 2015-07-03T07:33:42.257 に答える
3

ID を含めることができる、上記で説明されていない URL 拡張子がいくつかあります。

https://drive.google.com/drive/folders/ および https://drive.google.com/open?id= および https://drive.google.com/a/domain.edu.vn/folderview? ID=

このアイデアに基づいて構築され、上記の 2 つの拡張機能と /d/ を使用する拡張機能をカバーするソリューションを追加すると思いました。

function getIdFrom(url) {
  var id = "";
  var parts = url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);
  if (url.indexOf('?id=') >= 0){
     id = (parts[6].split("=")[1]).replace("&usp","");
     return id;
   } else {
   id = parts[5].split("/");
   //Using sort to get the id as it is the longest element. 
   var sortArr = id.sort(function(a,b){return b.length - a.length});
   id = sortArr[0];
   return id;
   }
 }
于 2016-10-29T23:22:45.823 に答える
2

どちらも私が探していたものではなかったので、与えられた2つの答えに基づいて作成した関数を追加したかっただけです。

function templateIdFrom(url) {
  var parts = url.match(/\/d\/(.+)\//);
  if (parts == null || parts.length < 2) {
    return url;
  } else {
    return parts[1];
  }
}

/d/これにより、次の までの部分が取得さ/れます。これにより、ドキュメントの URL には常に ID が含まれます。これに一致するものが見つからない場合は、ID と見なされる元のパラメーターを返すだけです。

于 2016-06-13T20:45:53.007 に答える
1

Henrique が提案した解決策は、ドメインがファイル URL の一部である可能性がある Google Workspace ユーザーによって Google ドライブ ファイルが共有されている場合のシナリオをカバーしていない可能性があります。ドメイン名が長い場合、ファイル URL の代わりにドメイン名が取得されます。

https://drive.google.com/a/thisisaverylongdomainname.org/file/d/1djf7XfuKx4Px55x7ahvMa5uznp3Ibe5vd7Y/view?usp=sharing

Google ドライブによって生成されたファイル ID にはピリオド (.) が含まれていないため、この変更された正規表現はドメイン名のキャプチャを防ぐことができます。

function getFileIdFromDriveUrl(url) {
  var match = url.match(/([a-z0-9_-]{25,})[$/&?]/i);
  return match ? match[1] : null;
}
于 2020-12-22T13:04:53.127 に答える
1

Python の場合:

固定長の Google ドライブ ID の場合、次のように使用できます。

regex = "([\w-]){33}|([\w-]){19}"
match = re.search(regex,url)

Google ドライブは、通常のドライブに 33 文字、チーム ドライブに 19 文字を使用します

固定長を使用せず、代わりに先行パターンを使用する別のアプローチ:

regex = "(?<=/folders/)([\w-]+)|(?<=%2Ffolders%2F)([\w-]+)|(?<=/file/d/)([\w-]+)|(?<=%2Ffile%2Fd%2F)([\w-]+)|(?<=id=)([\w-]+)|(?<=id%3D)([\w-]+)"

match = re.search(regex,url)
于 2020-08-21T21:04:18.420 に答える
0

URL をセルに入力し、それを App Script に取り込んで別のことを行うシートがあります (シートのコンテンツを含むフォルダー内にドキュメントを作成するなど)。

シンプルstr.split("/")に ID を取り出しました。URL に が含まれている場合は/u/0/、インデックスを少し下に移動するだけです。

if (sheet.getRange("D2").getValue().split("/")[4] === "u") {
  folderId = sheet.getRange("D2").getValue().split("/")[7];
} else {
  folderId = sheet.getRange("D2").getValue().split("/")[5];
}

ただし、指定された 2 つの Google ドライブ URL 形式でのみ機能します。他にはあまり遭遇していませんがdrive.google.com/drive/folders/#folderIddrive.google.com/drive/u/o/folders/#folderId.

于 2021-08-13T03:31:07.473 に答える