Initiate Appmaker Document Approval from Google Dr

2019-01-29 10:39发布

I've customized Document Management System template in Appmaker as per my needs. Now instead of going to Appmaker every time to initiate an approval I want to provide functionality to initiate the workflow from Google Drive.So users can select file for Approval directly from Google Drive.

My question is is there any Rest call or something via which I can initiate DMS workflow from Third party app?

1条回答
贪生不怕死
2楼-- · 2019-01-29 11:22

Well I found a way out to achieve the result.

Steps:

  1. Drive API provides a way to add your App in 'Open With' menu in Google Drive.
  2. So I've created my custom app and deployed it. This app will simply receive params from Google Drive 'Open with' menu and pass it to Appmaker Document Approval System.
  3. In Appmaker Create request page parse if request contains these params, if yes then select files using these params.
  4. This way my users can initiate the Document Approval Workflow from Google Drive.

References :

  1. How to add/list your App in Google Drive

  2. Step by Step video guideline to Create and publish your App

Code:

  1. 'Open With' App code for redirecting users from Google Drive to Appmaker.

code.gs:

var AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/auth'; 
var TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'; 

var REDIRECT_URL= ScriptApp.getService().getUrl();
var tokenPropertyName = 'GOOGLE_OAUTH_TOKEN'; 

var CLIENT_ID = 'your client id';
var CLIENT_SECRET = 'your client secrect';

function doGet(e) {
  var HTMLToOutput;

  if(e.parameters.state){
    var state = JSON.parse(e.parameters.state);
    if(state.action === 'create'){
      HTMLToOutput = "<html><h1>Creation Of Docs Not supported by this App!</h1></html>"; 
    }
    else {
      var id = state.exportIds;
       var file = DriveApp.getFileById(id);
       //append params to your appmaker URL
      var url = 'yourappmaker published url'+'?param1='+file.getName()+'&param2='+file.getUrl()+'#AddRequest';
      HTMLToOutput = HtmlService.createHtmlOutput('<html><script>'
  +'window.close = function(){window.setTimeout(function(){google.script.host.close()},9)};'
  +'var a = document.createElement("a"); a.href="'+url+'"; a.target="_blank";'
  +'if(document.createEvent){'
  +'  var event=document.createEvent("MouseEvents");'
  +'  if(navigator.userAgent.toLowerCase().indexOf("firefox")>-1){window.document.body.append(a)}'                          
  +'  event.initEvent("click",true,true); a.dispatchEvent(event);'
  +'}else{ a.click() }'
  +'close();'
  +'</script>'
  // Offer URL as clickable link in case above code fails.
  +'<body style="word-break:break-word;font-family:sans-serif;">Failed to open automatically. <a href="'+url+'" target="_blank" onclick="window.close()">Click here to proceed</a>.</body>'
  +'<script>google.script.host.setHeight(40);google.script.host.setWidth(410)</script>'
  +'</html>')
  .setWidth( 90 ).setHeight( 1 );
    }
  }
  else if(e.parameters.code){//if we get "code" as a parameter in, then this is a callback. we can make this more explicit
    getAndStoreAccessToken(e.parameters.code);
    HTMLToOutput = '<html><h1>App is installed, you can close this window now or navigate to your <a href="https://drive.google.com">Google Drive</a>.</h1></html>';
  }
  else {//we are starting from scratch or resetting
    HTMLToOutput = "<html><h1>Install this App into your Google Drive!</h1><a href='"+getURLForAuthorization()+"'>click here to start</a></html>";
  }
  console.log(getURLForAuthorization());
  return HtmlService.createHtmlOutput(HTMLToOutput);
}

function getURLForAuthorization(){
  return AUTHORIZE_URL + '?response_type=code&client_id='+CLIENT_ID+'&redirect_uri='+REDIRECT_URL +
    '&scope=https://www.googleapis.com/auth/drive.install https://www.googleapis.com/auth/userinfo.email';  
}

function getAndStoreAccessToken(code){
  var parameters = { method : 'post',
                    payload : 'client_id='+CLIENT_ID+'&client_secret='+CLIENT_SECRET+'&grant_type=authorization_code&redirect_uri='+REDIRECT_URL+'&code=' + code};

  var response = UrlFetchApp.fetch(TOKEN_URL,parameters).getContentText();   
  var tokenResponse = JSON.parse(response);
  UserProperties.setProperty(tokenPropertyName, tokenResponse.access_token);
}

function getUrlFetchOptions() {
  return {'contentType' : 'application/json',
          'headers' : {'Authorization' : 'Bearer ' + UserProperties.getProperty(tokenPropertyName),
                       'Accept' : 'application/json'}};
}

//naive check, not using for now, use refresh tokens and add proper checking
function isTokenValid() {
  return UserProperties.getProperty(tokenPropertyName);
}
  1. In Document workflow 'Create Request' page, add event to onAttach() method. Write below function,

//client side

function checkIfRedirected(widget)
{
//   console.log(location.origin);  
  google.script.url.getLocation(function(location) {
  var params = location.parameter;
  var param1 = params.param1;
    var param2 = params.param2;
    widget.datasource.item.DocumentName = param1;
    widget.datasource.item.DocumentUrl = param2;    
    widget.datasource.item.Owner = app.user.email;
  });
}
查看更多
登录 后发表回答