View difference between Paste ID: 4fUPV829 and CVZNxkKv
SHOW: | | - or go back to the newest paste.
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-
UserProperties version to allow multiUser on one single deplOyed version
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-
Doc creator script : it allows to create a doc every working day by copying a chosen template. All copies are renamed with the date and are in the same original folder.
5+
Added ability to test create on weekend !!
6-
Serge Gabet aka serge Insas september-10-2013 **Google Apps Script**
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-
var btnAttributes = {'padding':'3px','font-family':"Arial, sans-serif",'fontSize':'10pt','border-radius':'4px'}
10+
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-
  var folderlist = new Array();
14+
15-
  var folders=DocsList.getFolders()
15+
  var folderlist = []
16-
  for(var ff=0;ff<folders.length;++ff){
16+
  var allFolders = listFolders();
17-
    folderlist.push(folders[ff].getName());
17+
  for(var ff=1;ff<allFolders.length;++ff){
18
    Logger.log(allFolders[ff][1]);
19
    var folder = DocsList.getFolder(allFolders[ff][1]);
20-
  var Apanel = app.createAbsolutePanel().setSize('100%', '100%').setStyleAttribute('background', 'dedeff')
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-
  var Flist= app.createListBox(false).setName("Flb").setId("Flb").setVisibleItemCount(12).setWidth("180");
23+
    }catch(err){}
24-
  var Dlist= app.createListBox(false).setName("Dlb").setId("Dlb").setVisibleItemCount(12).setWidth("280");
24+
25
  var app = UiApp.createApplication().setTitle("AutoDocCreator");
26
  var Apanel = app.createScrollPanel().setSize('100%', '100%').setStyleAttribute('background', 'f5f5ff');
27-
  var Flab=app.createLabel('Folder List').setWidth("80");
27+
28-
  var Dlab=app.createLabel('Document List').setWidth("100");
28+
29
  var Flist= app.createListBox(false).setName("Flb").setId("Flb").setVisibleItemCount(12).setWidth("280");
30-
  Flist.addItem('Choose a folder').addItem('Root content');
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-
  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);                            
38+
39-
  var cpanel = app.createVerticalPanel().add(choose).add(chosen);
39+
40
  var docname = app.createLabel().setId('doc');
41
  var link = app.createAnchor('open ', 'href').setId("link").setVisible(false);
42-
  var grid = app.createGrid(5,3);
42+
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-
      .setWidget(4,1,cpanel)
51+
  if(UserProperties.getProperty('mailCheck')=='true'){mailCheck.setValue(true)};
52-
      .setWidget(4,0,kill)
52+
  var grid = app.createGrid(8,3);
53-
      .setWidget(4,2,wait)
53+
54
      .setWidget(1,0,Flist)
55
      .setWidget(0,1,Dlab)
56-
//
56+
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-
  query.addKeyUpHandler(queryHandler)
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-
  choose.addClickHandler(createTrigHandler)
75+
76-
  chosen.addClickHandler(createTrigHandler)
76+
77
  FHandler.addCallbackElement(panel);
78
  
79
  var queryHandler = app.createServerHandler("setTemplate");
80-
return app   ;  }
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-
  var queryBox =app.getElementById('query')
93+
  return app;  
94
}
95
96-
  var folderName = e.parameter.Flb;
96+
function listFolders() {
97-
  if(e.parameter.source=='query'){queryBox.setText(e.parameter.query)}
97+
  var topFolder = DocsList.getRootFolder() ; // start point
98
  var foldersArray = [];
99
  foldersArray = getFolders(topFolder.getName().replace('Root','MyDrive'),topFolder,foldersArray);
100
  return foldersArray;
101-
  if (folderName!='Root content'&&query!=''){
101+
102-
    doclist = DocsList.getFolder(folderName).getFiles(0,2000)
102+
103
function getFolders(path, container,arrayin) {
104
  var folders = container.getFolders(0, 300);
105
  var folderCount = folders.length;
106-
  } else if (folderName!='Root content'&&query==''){
106+
  var docCount = container.getFilesByType(DocsList.FileType.DOCUMENT).length;
107-
    doclist = DocsList.getFolder(folderName).getFiles(0,2000)
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-
  } else if (folderName=='Root content'&&query!=''){
111+
    var thisPath = path+"/"+thisFolder;
112-
    doclist = DocsList.getRootFolder().getFiles(0,2000)
112+
    getFolders(thisPath,folders[i],arrayin)
113
  }
114
  return arrayin;
115
}
116-
  } else if (folderName=='Root content'&&query==''){
116+
117-
    doclist = DocsList.getRootFolder().getFiles(0,2000)
117+
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-
  if(names.length==0){queryBox.setStyleAttribute('background','#ffaaaa')}else{queryBox.setStyleAttribute('background','#ffffff')}              
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-
  UserProperties.setProperty('docInfos',names.toString());
128+
129
  var doclist = new Array();
130-
  return app   ;// update UI
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-
  var docInfos = UserProperties.getProperty('docInfos').split(',');
141+
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-
    var doctype = docInfos[docindex*3+2]
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-
    var doclink = urlstring+docInfos[docindex*3+1]+poststring;
153+
154
  if(names.length==0){queryBox.setStyleAttribute('background','#ffaaaa')}else{queryBox.setStyleAttribute('background','#ffffff')};            
155
  names.sort();
156-
    var IDs = docInfos[docindex*3+1]+"|"+doctype;
156+
157
  for(dd=0;dd<names.length;++dd){
158
    Dlist.addItem(names[dd][0]+" (doc Nr:"+dd+")");
159-
  return app   ;// update UI
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-
                           '<br>(document name = <b>'+docN+'+ date</b>)<br>Use the button below to start the process');
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-
      if (triggers[i].getUniqueId() == Existingtriggers[n]) {
193+
194
    if(doctype=='document'){choose.setVisible(true)}else{choose.setVisible(false)};
195-
        Logger.log('deleted');
195+
    var IDs = docInfos[docindex][1]+"|"+doctype;
196
    UserProperties.setProperty('IDs',IDs);
197
  }
198
  return app;
199
}
200
201
202-
  var html = app.createHTML('All triggers have been deleted, no document will be created anymore').setStyleAttributes(popAttributes)
202+
203-
  var pop = app.createPopupPanel(true,true).setPopupPosition(150,300).add(html).setPixelSize(400,40);
203+
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-
                            +')<br>To stop this process simply re-run this application and choose the "kill all processes" option').setStyleAttributes(popAttributes)
216+
217-
  var pop = app.createPopupPanel(true,true).setPopupPosition(150,300).add(html).setPixelSize(400,200);
217+
218
  UserProperties.setProperty('docID',ID);
219
  var makeTrigger = app.createServerHandler('makeTrig').addCallbackElement(panel);
220-
  if(UserProperties.getProperties().toString().match('triggers')=='triggers'){
220+
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-
  triggers.push(triggerID)
225+
226
  Logger.log('createTrigger');
227-
  return app
227+
228
}
229
230-
function createDocument(){
230+
function mailOption(e){
231-
  var today = new Date().getDay();
231+
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-
  var newDoc = DocsList.getFileById(docID).makeCopy(docName+Utilities.formatDate(new Date(),'EST','yyyy-MMM-dd'));
236+
    html.setHTML('No email will be sent')}
237-
  if(folderName!='Root content'){
237+
  var pop = app.createPopupPanel(true).setPopupPosition(150,300).add(html).setPixelSize(250,110).setStyleAttributes(popAttributes);
238-
  newDoc.addToFolder(DocsList.getFolder(folderName));
238+
239-
  newDoc.removeFromFolder(DocsList.getRootFolder());
239+
240
}
241
242-
//eof 09-10_2013
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