The Google Documents List API allows client applications to view and manipulate files in a user’s Documents List.
In this blog we would learn how to share documents and files between the Google Apps Domain.
When our application requests non-public user data, it must include an authorization token. The token also identifies your application to Google. Requests to the Google Documents List Data API for non-public user data must be authorized by an authenticated user. Here, OAuth authorization is used to authorize Documents List Data API as following:
name='docs';
scope='https://docs.google.com/feeds/';
function googleOAuth_(name,scope) {
var oAuthConfig = UrlFetchApp.addOAuthService(name);
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey(consumerKey);
oAuthConfig.setConsumerSecret(consumerSecret);
return {oAuthServiceName:name, oAuthUseToken:"always"};
}
Document and collection sharing is controlled via the access control list feed. Access control lists are just basic lists that show who has access to a given resource. In the ACL feed, different type of roles scopes are available for a given document or folder.
Document’s resource_id is required to share any document with other. Resource_id is the alphanumeric key, which shows in the url as ‘/d/<…resource_id…>/’. Authenticated user’s documents and files’s resource_id can be accessed by sending an authorized GET request as following:
var url = 'https://docs.google.com/feeds/<user_email_id>/private/full?v=3&alt=json'; var urlFetchResult = UrlFetchApp.fetch(url, fetchArgs);
The result is a feed that lists the user’s documents and files, each entry in the feed represents a resource associated with the user.
We can get particular docs’s resource_id by parse the json result. Then use split() to get document’s resource_id in each entry as follow:
var json = Utilities.jsonParse(urlFetchResult.getContentText());
var entry = json.feed.entry;
for(var i in entry){
var docId = {};
for(var j in entry[i]){
tempDoc.id = entry[i].id.$t.split('%3A')[1];
}
Post the following request to share document with user:
POST https://docs.google.com/feeds/<user_email_id>/private/full/resource_id/acl Authorization: <your authorization header here> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:gAcl='http://schemas.google.com/acl/2007'> <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/acl/2007#accessRule'/> <gAcl:role value='<role_type>'/> <gAcl:scope type='<scope>' value='<user2_email_id>'/> </entry>
Here is the complete code:
var consumerKey='<domain_name>'
var consumerSecret='<domain_consumerSecret_key>'
var user1='<email_id>' //Email_Id of the person, whose docs would be shared
var user2='<email_id>' //Email_Id of the person,to whom docs would be share
function DocumentSharing(){
var base = 'https://docs.google.com/feeds/';
//oAuth
var fetchArgs = googleOAuth_('docs', base);
var url = base + user1+'/private/full?v=3&alt=json';
var urlFetchResult = UrlFetchApp.fetch(url, fetchArgs);
var json = Utilities.jsonParse(urlFetchResult.getContentText());
var entry = json.feed.entry;
var docs = [];
fetchArgs.method = 'POST';
var rawXml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gAcl='http://schemas.google.com/acl/2007'>"
+"<category scheme='http://schemas.google.com/g/2005#kind' "
+"term='http://schemas.google.com/acl/2007#accessRule'/>"
+"<gAcl:role value='writer'/>"
+"<gAcl:scope type='user' value='"+user2+"'/>"
+"</entry>";
fetchArgs.payload = rawXml;
fetchArgs.contentType = 'application/atom+xml';
for(var i in entry){
var tempDoc = {};
for(var j in entry[i]){
tempDoc.id = entry[i].id.$t.split('%3A')[1];
tempDoc.title = entry[i].title.$t;
}
docs.push(tempDoc);
var url = base + user1+'/private/full/'+docs[i].id+'/acl?v=3&alt=json';
try{
var urlFetch = UrlFetchApp.fetch(url, fetchArgs);
}
catch(err){
MailApp.sendEmail(user2,docs[i].title+"("+user2+")","",
{htmlBody:"This user already has access to document <b>"+docs[i].title+"</b>"})
}
}
}
//Google oAuth
function googleOAuth_(name,scope) {
var oAuthConfig = UrlFetchApp.addOAuthService(name);
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey(consumerKey);
oAuthConfig.setConsumerSecret(consumerSecret);
return {oAuthServiceName:name, oAuthUseToken:"always"};
}
This script would share your all documents and files with another user. It also sends a notification mail to user (to whom docs is shared). If that user already accessed that document , a 409 server error would occurred. Here, try-catch is used to resolve this problem.
To know more about it Click Here





