serge_insas

autoDocCreator V2 ok final

Sep 11th, 2013
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Doc creator script : it allows to create a doc every working day by copying a chosen template. All copies are renamed with the date appended to the template name and are in the same original folder.
  3. V2 with mail notification & popups + recursive folder display - Using getFilesByType(DocsList.FileType.DOCUMENT) to try speeding up the app launch...
  4. Added the possibility to see the current process (triggers HAVE to be created with this version where the names are stored along with triggers ID)
  5. Added ability to test create on weekend !!
  6. UserProperties version to allow multiUser on one single deployed version
  7. Serge Gabet aka serge Insas september-12-2013 **Google Apps Script**
  8.   */
  9.  
  10. //styles
  11. var popAttributes = {'padding':'10px','font-family':"Arial, sans-serif",'fontSize':'14pt','color':'#000099','background':'#ffffee','border-radius':'10px'}
  12. var btnAttributes = {'padding':'6px','font-family':"Arial, sans-serif",'fontSize':'10pt','border-radius':'6px'}
  13.  
  14. function doGet(){
  15.   var folderlist = []
  16.   var allFolders = listFolders();
  17.   for(var ff=1;ff<allFolders.length;++ff){
  18.     Logger.log(allFolders[ff][1]);
  19.     var folder = DocsList.getFolder(allFolders[ff][1]);
  20.     try{
  21.     Logger.log('editors : '+folder.getEditors());// check if you have edit rights on this folder, if not > don't show in the list
  22.     folderlist.push(allFolders[ff][1]+' ('+allFolders[ff][3]+' docs)');
  23.     }catch(err){}
  24.   }
  25.   var app = UiApp.createApplication().setTitle("AutoDocCreator");
  26.   var Apanel = app.createScrollPanel().setSize('100%', '100%').setStyleAttribute('background', 'f5f5ff');
  27.   var wait = app.createImage('https://dl.dropboxusercontent.com/u/211279/loading3T.gif').setId('wait').setVisible(false);
  28.   var panel = app.createVerticalPanel().setStyleAttribute('padding', '30px').setId('panel');
  29.   var Flist= app.createListBox(false).setName("Flb").setId("Flb").setVisibleItemCount(12).setWidth("280");
  30.   var Dlist= app.createListBox(false).setName("Dlb").setId("Dlb").setVisibleItemCount(12).setWidth("350");
  31.   var queryL = app.createLabel('Search in folder :');
  32.   var query = app.createTextBox().setName('query').setId('query');
  33.   var Flab=app.createLabel('Folder List (with edit rights)').setWidth("280");
  34.   var Dlab=app.createLabel('Document List (text document only)').setWidth("350");
  35.   Flist.addItem('Choose a folder').addItem('My Drive');
  36.   for(ff=0;ff<folderlist.length;++ff){
  37.     Flist.addItem(folderlist[ff]);
  38.   }
  39.   var waitHandler = app.createClientHandler().forTargets(wait).setVisible(true);
  40.   var docname = app.createLabel().setId('doc');
  41.   var link = app.createAnchor('open ', 'href').setId("link").setVisible(false);
  42.   var choose = app.createButton('Choose as template Doc').setId('choose').setVisible(false).setStyleAttributes(btnAttributes).addClickHandler(waitHandler);
  43.   var chosen = app.createButton('Create a timer trigger for every day<br>at 00:00 from Monday to Friday').setId('chosen').setVisible(false).setStyleAttributes(btnAttributes).addClickHandler(waitHandler);  
  44.   var testCreateHandler = app.createServerHandler('testCreateDocument').addCallbackElement(panel);
  45.   var testCreate = app.createButton('Test create<br>the document',testCreateHandler).setId('testCreate').setVisible(false).setStyleAttributes(btnAttributes).addClickHandler(waitHandler);                            
  46.   var seeHandler = app.createServerHandler('seeTrig');
  47.   var killHandler = app.createServerHandler('killTrig');
  48.   var seeTrig = app.createButton('See all current processes', seeHandler).setStyleAttributes(btnAttributes).setId('see').addClickHandler(waitHandler);
  49.   var kill = app.createButton('Kill all current processes', killHandler).setStyleAttributes(btnAttributes).setId('kill').addClickHandler(waitHandler);
  50.   var mailCheck = app.createCheckBox('send mail on doc creation').setId('mailCheck').setName('mailCheck').setVisible(false);
  51.   if(UserProperties.getProperty('mailCheck')=='true'){mailCheck.setValue(true)};
  52.   var grid = app.createGrid(8,3);
  53.   grid.setWidget(0,0,Flab)
  54.       .setWidget(1,0,Flist)
  55.       .setWidget(0,1,Dlab)
  56.       .setWidget(1,1,Dlist)
  57.       .setWidget(2,0,queryL)
  58.       .setWidget(3,0,query)
  59.       .setWidget(2,1,docname)
  60.       .setWidget(3,1,link)
  61.       .setWidget(4,0,seeTrig)
  62.       .setWidget(5,0,kill)
  63.       .setWidget(5,1,choose)
  64.       .setWidget(6,1,chosen)
  65.       .setWidget(7,1,testCreate)
  66.       .setWidget(6,0,mailCheck)
  67.       .setWidget(7,0,wait);  
  68.   Apanel.add(panel.add(grid));
  69.  
  70.   var clihandler = app.createClientHandler()
  71.      .forTargets(choose).setVisible(true)
  72.      .forEventSource().setVisible(false);
  73.    choose.addClickHandler(clihandler);
  74.  
  75.   var FHandler = app.createServerHandler("setTemplate");
  76.   Flist.addChangeHandler(FHandler).addClickHandler(waitHandler);
  77.   FHandler.addCallbackElement(panel);
  78.  
  79.   var queryHandler = app.createServerHandler("setTemplate");
  80.   query.addKeyUpHandler(queryHandler);
  81.   queryHandler.addCallbackElement(panel);
  82.  
  83.   var DHandler = app.createServerHandler("showlab");
  84.   Dlist.addChangeHandler(DHandler).addClickHandler(waitHandler);
  85.   DHandler.addCallbackElement(panel);
  86.  
  87.   var createTrigHandler = app.createServerHandler("createTrigger");
  88.   choose.addClickHandler(createTrigHandler);
  89.   chosen.addClickHandler(createTrigHandler);
  90.   createTrigHandler.addCallbackElement(panel);
  91.  
  92.   app.add(Apanel);  
  93.   return app;  
  94. }
  95.  
  96. function listFolders() {
  97.   var topFolder = DocsList.getRootFolder() ; // start point
  98.   var foldersArray = [];
  99.   foldersArray = getFolders(topFolder.getName().replace('Root','MyDrive'),topFolder,foldersArray);
  100.   return foldersArray;
  101. }
  102.  
  103. function getFolders(path, container,arrayin) {
  104.   var folders = container.getFolders(0, 300);
  105.   var folderCount = folders.length;
  106.   var docCount = container.getFilesByType(DocsList.FileType.DOCUMENT).length;
  107.   if(path=='MyDrive'){arrayin.push(['https://drive.google.com/?hl=fr&tab=wo#my-drive',path,folderCount])}
  108.   else{arrayin.push([container.getUrl(),path.replace('MyDrive/',''),folderCount,docCount])}
  109.   for (var i=0;i<folders.length;i++) {
  110.     var thisFolder = folders[i].getName();
  111.     var thisPath = path+"/"+thisFolder;
  112.     getFolders(thisPath,folders[i],arrayin)
  113.   }
  114.   return arrayin;
  115. }
  116.  
  117. function setTemplate(e){
  118.   var app = UiApp.getActiveApplication();
  119.   var wait = app.getElementById('wait').setVisible(false);
  120.   var choose = app.getElementById("choose").setVisible(false);
  121.   var chosen = app.getElementById("chosen").setVisible(false);
  122.   var testCreate = app.getElementById("testCreate").setVisible(false);
  123.   var Dlist = app.getElementById("Dlb");  
  124.   var doclist=new Array();
  125.   var label = app.getElementById('doc');
  126.   var names = new Array();
  127.   var queryBox =app.getElementById('query');
  128.   var query = e.parameter.query.toLowerCase();
  129.   var doclist = new Array();
  130.   var folderName = e.parameter.Flb.substring(0,e.parameter.Flb.indexOf(' ('));// rip of the content counter ( xx docs)
  131.   if(e.parameter.source=='query'){queryBox.setText(e.parameter.query)};
  132.   if (folderName=='Choose a folder'){Dlist.clear();label.setText(" ");return app}
  133.   if (folderName!='My Drive'&&query!=''){
  134.     doclist = DocsList.getFolder(folderName).getFilesByType(DocsList.FileType.DOCUMENT);
  135.     for (nn=0;nn<doclist.length;++nn){
  136.       if(doclist[nn].getName().toLowerCase().match(query)==query){names.push([doclist[nn].getName(),doclist[nn].getId(),doclist[nn].getType()])}
  137.     }
  138.   } else if (folderName!='My Drive'&&query==''){
  139.     doclist = DocsList.getFolder(folderName).getFilesByType(DocsList.FileType.DOCUMENT)
  140.     for (nn=0;nn<doclist.length;++nn){
  141.       names.push([doclist[nn].getName(),doclist[nn].getId(),doclist[nn].getType()]);
  142.     }
  143.   } else if (folderName=='My Drive'&&query!=''){
  144.     doclist = DocsList.getRootFolder().getFilesByType(DocsList.FileType.DOCUMENT)
  145.     for (nn=0;nn<doclist.length;++nn){
  146.       if(doclist[nn].getName().toLowerCase().match(query)==query){names.push([doclist[nn].getName(),doclist[nn].getId(),doclist[nn].getType()])};
  147.     }
  148.   } else if (folderName=='My Drive'&&query==''){
  149.     doclist = DocsList.getRootFolder().getFilesByType(DocsList.FileType.DOCUMENT);
  150.     for (nn=0;nn<doclist.length;++nn){
  151.       names.push([doclist[nn].getName(),doclist[nn].getId(),doclist[nn].getType()]);
  152.     }
  153.   }
  154.   if(names.length==0){queryBox.setStyleAttribute('background','#ffaaaa')}else{queryBox.setStyleAttribute('background','#ffffff')};            
  155.   names.sort();
  156.   Dlist.clear();
  157.   for(dd=0;dd<names.length;++dd){
  158.     Dlist.addItem(names[dd][0]+" (doc Nr:"+dd+")");
  159.   }
  160.   Logger.log(names.length);
  161.   var html = app.createHTML('Only the 100 first items in '+folderName+' are shown<br>Use a folder to limit ').setStyleAttributes(popAttributes);
  162.   var pop = app.createPopupPanel(true).setPopupPosition(150,280).add(html).setPixelSize(400,65).setStyleAttributes(popAttributes);
  163.   Logger.log(names.length);
  164.   if(names.length>100){names=names.splice(names.length-100) ; pop.show()};
  165.   Logger.log(names.length);
  166.   UserProperties.setProperty('docInfos',Utilities.jsonStringify(names));
  167.   UserProperties.setProperty('folderName',folderName);
  168.   return app;
  169. }
  170.  
  171.  
  172. function showlab(e){
  173.   var app = UiApp.getActiveApplication();
  174.   var wait = app.getElementById('wait').setVisible(false);
  175.   var label = app.getElementById('doc');
  176.   var link = app.getElementById('link');
  177.   var choose = app.getElementById("choose").setVisible(false);
  178.   var chosen = app.getElementById("chosen").setVisible(false).setEnabled(true);
  179.   var testCreate = app.getElementById("testCreate").setVisible(false).setEnabled(true);
  180.   var docInfos = Utilities.jsonParse(UserProperties.getProperty('docInfos'));
  181.   if (e.parameter.Dlb!=""){
  182.     var docname = e.parameter.Dlb
  183.     var docN = docname.substr(0,docname.lastIndexOf("("));
  184.     var docindex = docname.substring(Number(docname.lastIndexOf(":"))+1,Number(docname.lastIndexOf(")")));
  185.     var doctype = docInfos[docindex][2];
  186.     label.setText(doctype+" : "+docN).setEnabled(false).setStyleAttribute('fontSize', '15');
  187.     if (doctype=='document'){var urlstring = "https://docs.google.com/document/d/";var poststring = "/edit"}
  188.     if (doctype=='spreadsheet'){var urlstring = "https://docs.google.com/spreadsheet/ccc?key=";var poststring = "#gid=0"}
  189.     if (doctype=='photo'){var urlstring = "https://docs.google.com/file/d/";var poststring = "/edit"}
  190.     if (doctype=='blob_item'){var urlstring = "https://docs.google.com/file/d/";var poststring = "/edit"}
  191.     if (doctype=='item'){var urlstring = "https://docs.google.com/file/d/";var poststring = "/edit"}
  192.     var doclink = urlstring+docInfos[docindex][1]+poststring;
  193.     link.setVisible(true).setText("Open "+doctype+" in browser").setHref(doclink);
  194.     if(doctype=='document'){choose.setVisible(true)}else{choose.setVisible(false)};
  195.     var IDs = docInfos[docindex][1]+"|"+doctype;
  196.     UserProperties.setProperty('IDs',IDs);
  197.   }
  198.   return app;
  199. }
  200.  
  201.  
  202. function createTrigger(e){
  203.   var app = UiApp.getActiveApplication();
  204.   var wait = app.getElementById('wait').setVisible(false);
  205.   var panel = app.getElementById('panel');
  206.   var kill = app.getElementById('kill').setVisible(false);
  207.   var IDs =  UserProperties.getProperty('IDs');  
  208.   var chosen = app.getElementById("chosen").setVisible(true);
  209.   var testCreate = app.getElementById("testCreate").setVisible(true);
  210.   var emailCheckHandler = app.createServerHandler('mailOption').addCallbackElement(panel);
  211.   var mailCheck = app.getElementById('mailCheck').setVisible(true).addClickHandler(emailCheckHandler);
  212.   if (e.parameter.source=='choose'){return app};
  213.   var ID = IDs.substring(0,Number(IDs.lastIndexOf("|")));
  214.   var doctype = IDs.substr(Number(IDs.lastIndexOf("|"))+1);
  215.   var docname = e.parameter.Dlb
  216.   var docN = docname.substr(0,docname.lastIndexOf("("));
  217.   UserProperties.setProperty('docName',docN);
  218.   UserProperties.setProperty('docID',ID);
  219.   var makeTrigger = app.createServerHandler('makeTrig').addCallbackElement(panel);
  220.   chosen.setEnabled(false);
  221.   var msg = app.createHTML('This document will be used as a template to create a new document every working day at 0 AM.'+
  222.                            '<br>(document name = <b>'+docN+'+ date</b>)<br>Use the button below to start the process<br>and (un)check the email option as desired');
  223.   var disableHandler = app.createClientHandler().forEventSource().setEnabled(false);
  224.   var startProcess = app.createButton('Start process',makeTrigger).addClickHandler(disableHandler).setStyleAttributes(btnAttributes);
  225.   panel.add(msg).add(startProcess);
  226.   Logger.log('createTrigger');
  227.   return app;
  228. }
  229.  
  230. function mailOption(e){
  231.   var app = UiApp.getActiveApplication();
  232.   var mailCheck = e.parameter.mailCheck=='true';
  233.   UserProperties.setProperty('mailCheck',mailCheck);
  234.   var html = app.createHTML().setStyleAttributes(popAttributes)
  235.   if(mailCheck){html.setHTML('A new mail will be sent on every working day around midnight with links to the 6 most recent documents created by this application.')}else{
  236.     html.setHTML('No email will be sent')}
  237.   var pop = app.createPopupPanel(true).setPopupPosition(150,300).add(html).setPixelSize(250,110).setStyleAttributes(popAttributes);
  238.   pop.show();
  239.   return app;
  240. }
  241.  
  242. function seeTrig(e){
  243.   if(!UserProperties.getProperty('triggers')){ UserProperties.setProperty('triggers','')};
  244.   var Existingtriggers =  UserProperties.getProperty('triggers').split(',');
  245.   var htmlString = '<b>Document names used as template:</b><br>'
  246.   for(var n=1;n<Existingtriggers.length;++n){
  247.     htmlString+='- '+Existingtriggers[n].split('|')[1]+'<br>';
  248.   }
  249.   var app = UiApp.getActiveApplication();
  250.   var wait = app.getElementById('wait').setVisible(false);
  251.   var html = app.createHTML(htmlString).setStyleAttributes(popAttributes);
  252.   var panel = app.createScrollPanel(html);
  253.   var pop = app.createPopupPanel(true).setPopupPosition(240,280).add(panel).setPixelSize(400,200).setStyleAttributes(popAttributes);
  254.   pop.show();
  255.   return app;
  256. }
  257.  
  258. function killTrig(e){
  259.   var Existingtriggers =  UserProperties.getProperty('triggers').split(',');
  260.   for(var n in Existingtriggers){
  261.     var triggers = ScriptApp.getProjectTriggers();
  262.     for (var i = 0; i < triggers.length; i++) {
  263.       if (triggers[i].getUniqueId() == Existingtriggers[n].split('|')[0]) {
  264.         ScriptApp.deleteTrigger(triggers[i]);
  265.         Logger.log('deleted '+Existingtriggers[n].split('|')[1]);
  266.       }
  267.     }
  268.   }
  269.   UserProperties.setProperty('triggers','');
  270.   UserProperties.setProperty('mailCheck',false);
  271.   UserProperties.setProperty('docUrls','');
  272.   var app = UiApp.getActiveApplication();
  273.   var wait = app.getElementById('wait').setVisible(false);
  274.   var html = app.createHTML('All triggers have been deleted,<br>no document will be created anymore and no mails will be sent.').setStyleAttributes(popAttributes);
  275.   var pop = app.createPopupPanel(true).setPopupPosition(150,280).add(html).setPixelSize(400,65).setStyleAttributes(popAttributes);
  276.   pop.show();
  277.   return app;
  278. }
  279.  
  280. function makeTrig(e){
  281.   var app = UiApp.getActiveApplication();
  282.   var wait = app.getElementById('wait').setVisible(false);
  283.   var folderName = UserProperties.getProperty('folderName');
  284.   var docName = UserProperties.getProperty('docName');
  285.   var docID = UserProperties.getProperty('docID');
  286.   var chkmail='';
  287.   if(e.parameter.mailCheck=='true'){chkmail='An email will be sent to you on every working day with the links of the 6 most recently created documents.<br>'};
  288.   var html = app.createHTML('A new document will be created every working day around midnight based on the template ('
  289.                             +docName+') in the chosen folder ('+folderName
  290.                             +')<br>'+chkmail+'<br>To stop this process simply re-run this application and choose the "kill all processes" option.').setStyleAttributes(popAttributes)
  291.   var pop = app.createPopupPanel(true).setPopupPosition(150,300).add(html).setPixelSize(400,230).setStyleAttributes(popAttributes);
  292.   pop.show();
  293.   var triggerID = ScriptApp.newTrigger('createDocument').timeBased().everyDays(1).atHour(0).create().getUniqueId();
  294.   if(UserProperties.getKeys().toString().match('triggers')=='triggers'){
  295.     var triggers =  UserProperties.getProperty('triggers').split(',');
  296.     }else{
  297.       var triggers = [];
  298.       }
  299.   triggers.push(triggerID+'|'+docName);
  300.   UserProperties.setProperty('triggers',triggers.toString());
  301.   return app;
  302. }
  303.  
  304. function testCreateDocument(e){
  305.   var IDs =  UserProperties.getProperty('IDs');  
  306.   var ID = IDs.substring(0,Number(IDs.lastIndexOf("|")));
  307.   var doctype = IDs.substr(Number(IDs.lastIndexOf("|"))+1);
  308.   var docname = e.parameter.Dlb
  309.   var docN = docname.substr(0,docname.lastIndexOf("("));
  310.   UserProperties.setProperty('docName',docN);
  311.   UserProperties.setProperty('docID',ID);
  312.   createDocument('test');
  313.   var app = UiApp.getActiveApplication();
  314.   var wait = app.getElementById('wait').setVisible(false);
  315.   var docName = UserProperties.getProperty('docName');
  316.   var folderName = UserProperties.getProperty('folderName');
  317.   Logger.log(docName+' '+folderName);
  318.   var html = app.createHTML('A test document has been created  ('+docName+') in the chosen folder ('+folderName+')').setStyleAttributes(popAttributes);
  319.   var pop = app.createPopupPanel(true).setPopupPosition(150,280).add(html).setPixelSize(400,65).setStyleAttributes(popAttributes);
  320.   pop.show();
  321.   return app;
  322. }
  323.  
  324. function createDocument(test){
  325.   if(!test){ var today = new Date().getDay()}else{today=1};
  326.   if(today==6 || today==0){return} ;// prevents creating doc on Saturday and Sunday
  327.   var folderName = UserProperties.getProperty('folderName');
  328.   var docName = UserProperties.getProperty('docName');
  329.   var docID = UserProperties.getProperty('docID');
  330.   var Folderhref = DocsList.getRootFolder().getUrl();
  331.   var newDoc = DocsList.getFileById(docID).makeCopy(docName+Utilities.formatDate(new Date(),Session.getTimeZone(),'yyyy-MMM-dd'));
  332.   if(folderName!='My Drive'){
  333.     newDoc.addToFolder(DocsList.getFolder(folderName));
  334.     newDoc.removeFromFolder(DocsList.getRootFolder());
  335.     Folderhref = DocsList.getFolder(folderName).getUrl();
  336.   }
  337.   var newDocUrl = newDoc.getName()+'|'+newDoc.getUrl();
  338.   if(UserProperties.getKeys().toString().indexOf('docUrls')!=-1||UserProperties.getProperty('docUrls')==''){
  339.     var docUrls =  UserProperties.getProperty('docUrls').split(',');
  340.     Logger.log(docUrls);
  341.   }else{
  342.       var docUrls = [];
  343.     }
  344.   var ll = docUrls.length;// check number of memorized docs
  345.   if(ll>5){
  346.     var newList = docUrls.splice(ll-5,5);// if more than 5 keep only last 5 docs
  347.     var docUrls = newList;
  348.   }
  349.   docUrls.push(newDocUrl);
  350.   UserProperties.setProperty('docUrls',docUrls.toString());
  351.   var mailCheck = UserProperties.getProperty('mailCheck')=='true';
  352.   if(!mailCheck){return};
  353.   var msg = 'AutoDocCreator V2 report on '+Utilities.formatDate(new Date(),Session.getTimeZone(),'yyyy-MMM-dd  HH:mm')
  354.   var txtMsg = msg+'\n\nA new document has been created for you,\nsee below the list of the most recent documents (most recent on top)\n\n'; // begin text only msg
  355.   msg+='<br><br>A new document has been created for you,<br>see below the list of the most recent documents (most recent on top)<br>';
  356.   msg+='created in <a href="'+Folderhref+'" target="_blank">your chosen folder ('+folderName+').</a><br><br>';
  357.   msg+='<table style="background-color:lightblue;border-collapse:collapse;" border = 1 cellpadding = 10><tr bgcolor = "#ffaaaa">';// most recent have reddish background
  358.   for(var n=docUrls.length-1;n>0;n--){
  359.     var x = docUrls[n].split('|');
  360.     var name = x[0];
  361.     var href = x[1];
  362.     msg+='<td>'+(docUrls.length-n)+'</td><td><a href="'+href+'" target="_blank">'+name+'</a></td></tr><tr>';// open link in other tab
  363.     txtMsg+=(docUrls.length-n)+' - '+name+' : '+href+'\n'
  364.   }
  365.   msg+='</table><br><br>Use <a href="'+ScriptApp.getService().getUrl()+'" target="_blank">this link</a> to run the application that created the files<br>';
  366.   txtMsg+='\n\nUse this link to run the application that created the files\n'+ScriptApp.getService().getUrl()+'\n';
  367.   MailApp.sendEmail(Session.getEffectiveUser().getEmail(),'AutoCreateDoc report', txtMsg,{'htmlBody':msg});
  368. }
  369. //eof 09-14_2013
Advertisement
Add Comment
Please, Sign In to add comment