2013-05-30 16 views
8

ここに私がやろうとしていることがあります.GoogleドキュメントのURLを指定すると、ドキュメントIDを取得してGoogleドライブにコピーを作成します。私はいくつかの正規表現やURLの置き換えでそれを達成できることは分かっていますが、URLに同じ文書を表現するためのいくつかの異なる形式があるので、私は汎用的な解決策を探していました。Google Apps ScriptのURLからファイルIDを取得する最も簡単な方法

現在、それは私が考えることが最善です:

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); 
} 

問題は、私の解決策が唯一の文書やスプレッドシートをカバーすることで、私は例えば、任意のアップロードしたファイルと同じことをしたいと思います:

DriveApp.getFileByUrl(url).makeCopy(); 
:要するに

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

は、私はそのような何かをしたかったです

誰でも知ることができますか?

ファイルURLからファイルIDを抽出するための安全な解決方法は、私にも適しています。

おかげ

答えて

34

DriveAppが実際に欠けているgetFileByUrl(ともそのことについてはフォルダ)。 Apps Script issue trackerで強化リクエストを開くことができます。

私のスクリプトで何をしますか(これらのopenByUrl関数は幾分新機能です)、正規表現を使用してIDを取得します。このような。

function getIdFromUrl(url) { return url.match(/[-\w]{25,}/); } 

この正規表現は、私が試したすべてのGoogleのURLのために働く:「のように見える」というフォルダやファイル、フュージョンテーブル、スプレッドシート、ドキュメント、プレゼンテーションなどのためのドライブのURLはそれは単なる文字列で何を検索しますGoogleのキー。つまり、(google key)有効な文字しか含まれていない大きな文字列です。

また、URLの代わりにIDを直接受け取っても機能します。これは、URLの代わりにIDを直接貼り付ける可能性があるため、ユーザーからのリンクを求めるときに便利です。

+0

私はいくつかのテストをしました。ありがとうございました。ちょうど質問:この数字(25)は実際にGoogleドキュメントIDの最小長ですか? – Renato

+0

これはどこにも記載されていません。私は様々なファイルからURLの束をとりました。最短のURLを見て、ちょうどその場合には割引を与えました:)また、URLの別の部分が遠く離れて25の文字に近くないことを確認しました。他の部分と混同することはありません。 –

+1

[aquadeepによって提案された正規表現](http://stackoverflow.com/a/31201136/1404066)を使用すると、望ましくないマッチングを行う可能性が低くなります。次に、(グループ)を使って正規表現のID部分だけを抽出します:url.match(/ \/d \ /(。{25、})\ /)[1]; – Kenigmatic

2

URLは、このようなもので、ファイルIDは、このパターンに存在する「/ D/XXXXXXXX /」ほぼすべてのGoogleドライブ/ドキュメントへのリンクについて:機能の下に使用
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('/'); 
} 
0

2つの指定された回答に基づいて作成した関数を追加したかったのは、どちらも探していなかったからです。

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

は、これは、文書のURLは、常に自分のIDを含める方法である、/d/後、最大次/までの部分を取得します。一致するものが見つからない場合は、IDとみなされる元のparamを単純に返します。

0

上記のURL拡張には、IDを含むことができるものがいくつかあります。

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

私はthis idea上に構築私の解決策を追加しようと思いまして、上記の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; 
    } 
} 
を使用するもの
関連する問題