2013-05-30 38 views
8

Đây là những gì tôi đang cố gắng làm: được cung cấp URL tài liệu của Google, tôi muốn nhận ID tài liệu để tạo bản sao trên Google Drive. Tôi biết tôi có thể đạt được điều đó bởi một số regex hoặc thay thế trên URL, nhưng vì có một số hình thức khác nhau để đại diện cho cùng một tài liệu trong một URL, tôi muốn tìm một giải pháp chung chung.Cách dễ nhất để lấy ID tệp từ URL trên Google Apps Script

Hiện nay, đó là tốt nhất mà tôi có thể nghĩ:

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

Vấn đề là giải pháp của tôi chỉ bao gồm tài liệu, bảng tính, tôi muốn làm điều tương tự với bất kỳ tập tin tải lên, ví dụ:

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

Nói tóm lại, tôi muốn một cái gì đó như thế:

DriveApp.getFileByUrl(url).makeCopy(); 

Có ai biết nếu có thể không?

Bất kỳ giải pháp an toàn nào để trích xuất ID tệp từ URL tệp cũng sẽ phù hợp với tôi.

Cảm ơn

Trả lời

34

DriveApp thực sự thiếu getFileByUrl (và cả thư mục cho vấn đề đó). Bạn có thể muốn mở yêu cầu nâng cao trên Apps Script issue tracker.

Nhưng những gì tôi làm trên tập lệnh của mình (vì các chức năng openByUrl này có phần mới), là lấy id bằng cách sử dụng regex. Như thế này.

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

regex này làm việc cho bất kỳ url google Tôi đã thử: url Drive cho các thư mục và các tập tin, Fusion Tables, Spreadsheets, Documents, trình bày, vv Nó chỉ trông cho bất cứ điều gì trong một chuỗi "trông giống như" một khóa Google. Đó là, bất kỳ chuỗi đủ lớn nào chỉ có các ký tự hợp lệ (google key) trong đó.

Ngoài ra, nó hoạt động ngay cả khi nó nhận được ID trực tiếp, thay vì URL. Điều này hữu ích khi bạn hỏi liên kết từ người dùng, vì một số có thể dán id trực tiếp thay vì url và nó vẫn hoạt động.

+0

Tôi đã thực hiện một số thử nghiệm và có vẻ tuyệt vời! Cảm ơn bạn. Chỉ cần một câu hỏi: con số này (25) thực sự là chiều dài tối thiểu cho id tài liệu google? – Renato

+0

Đây không phải là tài liệu ở bất cứ đâu. Tôi chỉ lấy một bó URL từ các tệp khác nhau, nhìn vào tệp ngắn nhất và giảm giá chỉ trong trường hợp :) Cũng đã kiểm tra rằng không có phần nào khác của url từ xa gần 25 ký tự thẳng (không có dấu chấm ở giữa) vv), do đó, nó sẽ không gây nhầm lẫn với một phần khác. –

+1

Sử dụng [regex được đề xuất bởi aquadeep] (http://stackoverflow.com/a/31201136/1404066) ít có khả năng tạo ra một kết quả không mong muốn. Sau đó, sử dụng (nhóm) để trích xuất chỉ phần ID của regex: url.match (/ \/d \/(. {25,}) \ //) [1]; – Kenigmatic

2

Url là một cái gì đó như thế này và file id hiện diện trong mô hình này "/ d/XXXXXXXX /" cho hầu hết các liên kết Google Drive/Documents:
https://drive.google.com/file/d/0B3tB9BU9FRnpcTJmS2FoaktsQzA/view

Sử dụng dưới đây chức năng, chúng tôi có thể nhận được '/ d/fileid/'và sau đó cắt ngắn'/d/'từ đầu và'/'từ cuối.

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

Tôi chỉ muốn thêm hàm tôi đã tạo dựa trên hai câu trả lời đã cho, vì không phải là những gì tôi đang tìm kiếm.

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

này được phần sau /d/ và cho đến tiếp theo /, đó là cách các URL tài liệu luôn chứa ID của họ. Nếu không tìm thấy kết quả phù hợp cho điều này, thì chúng ta chỉ cần trả lại tham số ban đầu, được giả định là ID.

0

Có một số tiện ích mở rộng URL khác không được đề cập ở trên có thể chứa ID.

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

tôi nghĩ rằng tôi muốn thêm giải pháp của tôi được xây dựng dựa trên this idea, và bao gồm hai phần mở rộng ở trên, cũng như những người sử dụng/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; 
    } 
} 
Các vấn đề liên quan