├── 2023-May └── Sheet Formulas │ ├── Average │ ├── Calculate the sum of the even numbers in a range │ ├── Capitalize │ ├── Convert a number to its Roman numeral equivalent │ ├── Count the number of occurrences of a given substring in a string │ ├── Decimal to binary and hex │ ├── Extract the domain name from a given URL │ ├── Return the last number of characters of a string │ ├── String to title case │ ├── Sum of Squares │ ├── compound interest │ ├── concat Strings │ ├── counter of range occurances │ ├── current age formula │ ├── distance between 2 points on earth │ ├── factoral formula Callback │ ├── factorial of a given number │ ├── palindrome checker │ └── random number formula ├── 2023Apr ├── Add a new column before and after in sheets ├── Class Lock ├── Copy Sheet data to new sheet ├── Create a Pivot Table ├── Create a new Google Slides presentation ├── create a filter with apps script └── sort by column ├── 2023Feb ├── Average Range custom sheet function ├── Covert Doc to Text ├── Create Folder inside folder ├── Create Form ├── Custom Sheet Formula ├── Email Docs and Create HTML file ├── Email Out ├── Get attachments from Gmail and Copy To Drive ├── Log Attachments into sheet ├── Logger Example ├── PDF from a Google Document ├── Random Numbers SHeet Range ├── Read sheet data and update ├── Send Notificaton Sheet ├── SendEmail PDF attach ├── Sheet Chart Borders and Styles Updates ├── Sheet Image Adder in cell ├── Sheets and Calendar Events ├── UI sort Asc or Des custom menu ├── copy DOC bullets ├── create and update Doc ├── create trigger to notify on form submission ├── custom sheet menu UI ├── make and update sheet ├── new calendar event ├── onecit and custom log ├── read sheet data getDataRange ├── send email from sheet data ├── sheet custom function ├── use form data in email └── write to sheet ├── 2023Mar ├── Create Slide update text in slide ├── EMail HTML table from sheet data ├── Form Data ├── PDF of single Sheet ├── Sheet Data as JSON web App Output ├── add slide update chart from sheet to slide ├── create a form with code ├── create and copy files into new folder ├── create files list folder file contents to sheet ├── data from form ├── email file as attachment ├── modify sheet data ├── send sheet data emails ├── translate quotes ├── update doc element style └── update form values ├── APPS SCRIPT ├── CalendarApp Methods for Google Calenda ├── Conditional Rules Format ├── Doc Template PDF ├── Doc and file maker Macros ├── DocumentApp ├── DriveApp Service ├── Files and Folders in Drive ├── Form AutoResponse Trigger Send PDF email ├── Form Service Make Forms ├── Gmail Service GmailApp Class ├── PDF maker ├── PDF sender ├── Sheets range updater ├── SpreadsheetApp Code Examples ├── UI menu maker ├── Update Spreadsheet sheet prepend rows ├── Web Apps with Apps Script ├── add Triggers automation ├── client side web app host service data ├── create an endpoint for web apps └── custom Functions ├── Apps Script Emailer ├── Apps Script Code └── temp HTML template for email ├── Apps Script WebApp Sheet as JSON AJAX get Sheet data with JavaScript ├── Between The BRackets Source ├── Client Side WebApp with Data ├── ClientSide Form File Upload to Drive Folder ├── Code Example Google Apps Script set Style of text with Code ├── ContentService Examples ├── Create Docs and Update Docs ├── Create PDF from Google Slides ├── Create UI menu with array of data ├── Create and Update Doc ├── Create array prototype ├── Dialogs Modals Server Side and Client Side code ├── Docsand replacetext ├── Gmail App Labels ├── Google Doc as HTML into a webapp dynamically ├── Google Sheet Data API ├── Google Sheet Data as JSON for AJAX data ├── Google Sheet as array Data ├── Google Sheets └── copyTo Examples ├── HTMLService Code Examples ├── HTMLService Parameter ├── PDF Creator from Doc template ├── Remove Duplicate Rows of Data ├── Sheet API Final ├── Sheet as JSON ├── Fetch Connection ├── JSON data with Headings ├── JSON sheet path Generator └── Sheet Data with Query Language ├── Sheet values Send Email via UI click ├── UI menu script alert prompt ├── Upload from Computer to Gdrive ├── WebApp Client to Server Side Communications Code Example ├── Youtube └── Apps Script Sheets Common Question ├── send email notiifications ├── sheet data as table in doc ├── sheets data API ├── spreadsheet get cell data ├── testing mock ChatGPT └── webapp GET POST /2023-May/Sheet Formulas/Average: -------------------------------------------------------------------------------- 1 | function AVE_Above_Threshold(range,threhold) { 2 | let sum = 0; 3 | let count = 0; 4 | const arr = range.trim().split(','); 5 | arr.forEach(val =>{ 6 | let num = parseInt(val.trim()); 7 | if(num >= threhold){ 8 | count++; 9 | sum += num; 10 | } 11 | }) 12 | return count == 0 ? 0 : sum/count; 13 | } 14 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Calculate the sum of the even numbers in a range: -------------------------------------------------------------------------------- 1 | function SUM_OF_EVEN(first,second) { 2 | let sum = 0; 3 | for (let i = first; i < second+1; i++) { 4 | if (i % 2 === 0) { 5 | sum += i; 6 | } 7 | } 8 | return sum; 9 | } 10 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Capitalize: -------------------------------------------------------------------------------- 1 | function CAPITALIZE_WORDS(str) { 2 | const words = str.split(' '); 3 | for(let i=0;i= romanValues[key]){ 21 | roman += key; 22 | num -= romanValues[key]; 23 | } 24 | } 25 | return roman; 26 | } 27 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Count the number of occurrences of a given substring in a string: -------------------------------------------------------------------------------- 1 | function COUNT_SUBSTR(str,sbStr){ 2 | let count = 0; 3 | let pos = str.indexOf(sbStr); 4 | while (pos !== -1){ 5 | count++; 6 | pos = str.indexOf(sbStr,pos+1); 7 | } 8 | return count; 9 | } 10 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Decimal to binary and hex: -------------------------------------------------------------------------------- 1 | function DEC_TO_BINARY(dec){ 2 | return dec.toString(2); 3 | } 4 | function DEC_TO_HEX(dec){ 5 | return dec.toString(16); 6 | } 7 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Extract the domain name from a given URL: -------------------------------------------------------------------------------- 1 | function GET_DOMAIN(url){ 2 | let domain = ''; 3 | let matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); 4 | if(matches && matches[1]){ 5 | domain = matches[1]; 6 | } 7 | return domain; 8 | } 9 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Return the last number of characters of a string: -------------------------------------------------------------------------------- 1 | function LAST_VALS(str,num){ 2 | if(num >= str.length){ 3 | return str; 4 | } 5 | return str.slice(str.length - num); 6 | } 7 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/String to title case: -------------------------------------------------------------------------------- 1 | function TITLE_CASE(str){ 2 | const words = str.toLowerCase().split(' '); 3 | words.forEach((ele,ind) =>{ 4 | words[ind] = ele.charAt(0).toUpperCase()+ele.slice(1); 5 | }) 6 | return words.join(' '); 7 | } 8 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/Sum of Squares: -------------------------------------------------------------------------------- 1 | function SUM_OF_SQUARES(range){ 2 | let sum = 0; 3 | range = range.toString(); 4 | range = range.replace(/\s+/g,'').trim(); 5 | const arr = range.split(','); 6 | arr.forEach(val =>{ 7 | sum += val * val; 8 | }) 9 | return sum; 10 | //return JSON.stringify(arr); 11 | } 12 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/compound interest: -------------------------------------------------------------------------------- 1 | function COMPOUND_INTEREST(principal, rate, time) { 2 | var interest = principal * (Math.pow((1 + (rate / 100)), time) - 1); 3 | return interest.toFixed(2); 4 | } 5 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/concat Strings: -------------------------------------------------------------------------------- 1 | function CONCAT_CAP(str1,str2){ 2 | const stra = upperMe(str1); 3 | const strb = upperMe(str2); 4 | return stra.concat(strb); 5 | } 6 | function CONCAT_CAP2(str1,str2){ 7 | const stra = str1.chatAt(0).toUpperCase(); 8 | const concatVal = str1.concat(str2); 9 | let firstLetter = concatVal.charAt(0).toUpperCase(); 10 | let restVals = concatVal.slice(1).toLowerCase(); 11 | return firstLetter + restVals; 12 | } 13 | function upperMe(val){ 14 | Logger.log(val); 15 | return val.charAt(0).toUpperCase() + val.slice(1).toLowerCase(); 16 | } 17 | 18 | function test(){ 19 | const val = 'laurence'; 20 | upperMe(val); 21 | } 22 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/counter of range occurances: -------------------------------------------------------------------------------- 1 | function COUNT_VAL(range,val){ 2 | let count = 0; 3 | const arr = range.split(','); 4 | arr.forEach(v =>{ 5 | if(val == v.trim()){ 6 | count++; 7 | } 8 | }) 9 | return count; 10 | } 11 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/current age formula: -------------------------------------------------------------------------------- 1 | function CAL_AGE(birthdate){ 2 | const mils = Date.now() - birthdate.getTime(); 3 | const ageDate = new Date(mils); 4 | const age = Math.abs(ageDate.getUTCFullYear()-1970); 5 | return age; 6 | } 7 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/distance between 2 points on earth: -------------------------------------------------------------------------------- 1 | function DISTANCE_BETWEEN(lat1,lon1,lat2,lon2){ 2 | const earthRadius = 6371; 3 | const dLat = degreesToRadians(lat2-lat1); 4 | const dLon = degreesToRadians(lon2-lon1); 5 | const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + 6 | Math.cos(degreesToRadians(lat1)) * Math.cos(degreesToRadians(lat2)) * 7 | Math.sin(dLon / 2) * Math.sin(dLon / 2); 8 | const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 9 | const distance = earthRadius * c; 10 | return distance; 11 | } 12 | 13 | function degreesToRadians(deg){ 14 | return deg * Math.PI /180; 15 | } 16 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/factoral formula Callback: -------------------------------------------------------------------------------- 1 | function FACTORIALVAL(val){ 2 | if(val == 0){ 3 | return 1; 4 | }else{ 5 | Logger.log(val); 6 | return val * FACTORIALVAL(val-1); 7 | } 8 | } 9 | 10 | function test1(){ 11 | let v =4; 12 | Logger.log(FACTORIALVAL(v)); 13 | } 14 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/factorial of a given number: -------------------------------------------------------------------------------- 1 | function FACTORIAL(n){ 2 | if(n===0 || n===1){ 3 | return 1; 4 | }else{ 5 | return n * FACTORIAL(n-1); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /2023-May/Sheet Formulas/palindrome checker: -------------------------------------------------------------------------------- 1 | function IS_PALINDROME(str){ 2 | str = str.toString(); 3 | str = str.toLowerCase().replace(/[^a-z0-9]/g,''); 4 | for(let i=0;i{ 9 | const name = user[0]; 10 | const uid = user[2]; 11 | const email = user[1]; 12 | const subject = `Test Email ${name}`; 13 | const body = `

Hello ${name}

Your user ID is ${uid}`; 14 | const html = `
New Div
${body}`; 15 | const blob = Utilities.newBlob(html,'text/html',`${name}.html`); 16 | const file = DriveApp.getFileById(id); 17 | //MailApp.sendEmail(email,subject,body); 18 | MailApp.sendEmail({ 19 | to:email, 20 | subject:subject, 21 | htmlBody:body, 22 | attachments:[file.getAs(MimeType.PDF),blob] 23 | }); 24 | Logger.log(name); 25 | }) 26 | 27 | } 28 | -------------------------------------------------------------------------------- /2023Feb/Email Out: -------------------------------------------------------------------------------- 1 | function emailOut(){ 2 | const sheet = SpreadsheetApp.getActiveSheet(); 3 | const data = sheet.getDataRange().getValues(); 4 | Logger.log(data); 5 | const subject = 'My Update'; 6 | const message = 'Hello, \n\nMy update info!\n\nRegards,\nLaurence Svekis'; 7 | for(let i=1;i { 6 | thread.getMessages().forEach(message => { 7 | message.getAttachments().forEach(attachment => { 8 | const file = folder.createFile(attachment.copyBlob().setName(attachment.getName())); 9 | attachments.push(attachment.getName()); 10 | }) 11 | }) 12 | }) 13 | Logger.log(attachments); 14 | } 15 | -------------------------------------------------------------------------------- /2023Feb/Log Attachments into sheet: -------------------------------------------------------------------------------- 1 | function getAtt(){ 2 | const id = '132trziyDq_foIdRW0vciq2rm2NT-UKvLa8IvLsk8qIk'; 3 | const threads = GmailApp.search('has:attachment'); 4 | const ss = SpreadsheetApp.openById(id); 5 | const sheet = ss.insertSheet(); 6 | sheet.setName('Attachments'); 7 | threads.forEach(thread =>{ 8 | const messages = thread.getMessages(); 9 | messages.forEach(message => { 10 | const attments = message.getAttachments(); 11 | attments.forEach(attachment =>{ 12 | Logger.log(attachment.getName()); 13 | const arr = [attachment.getName(),attachment.getSize(),attachment.getContentType()]; 14 | sheet.appendRow(arr); 15 | }) 16 | }) 17 | 18 | }) 19 | 20 | } 21 | -------------------------------------------------------------------------------- /2023Feb/Logger Example: -------------------------------------------------------------------------------- 1 | function hello(){ 2 | const message = 'Laurence Svekis'; 3 | Logger.log(message); 4 | for(let i=0;i<20;i++){ 5 | Logger.log(i); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /2023Feb/PDF from a Google Document: -------------------------------------------------------------------------------- 1 | const ID = '1SCE46vJBcWzMXCwhTBW_HsWKFjiwZCXXVY'; 2 | const FOLDERID = '1sFNkLlWwZ'; 3 | 4 | function generatePDF(){ 5 | const url = 'https://basescripts.com/wp-content/uploads/2023/02/JavaScript-interview-questions-with-code-examples.pdf'; 6 | const fileName = 'Web PDF file'; 7 | const pdf = UrlFetchApp.fetch(url).getBlob(); 8 | const folder = DriveApp.getFolderById(FOLDERID); 9 | folder.createFile(pdf).setName(fileName); 10 | } 11 | 12 | function genPDF(){ 13 | const doc = DriveApp.getFileById(ID); 14 | const pdf = doc.getAs('application/pdf'); 15 | pdf.setName('test1'); 16 | const folder = DriveApp.getFolderById(FOLDERID); 17 | folder.createFile(pdf); 18 | } 19 | -------------------------------------------------------------------------------- /2023Feb/Random Numbers SHeet Range: -------------------------------------------------------------------------------- 1 | const ID = '132trziyDq_foIdRW0vciq2rm2NT-UKvLa8IvLsk8qIk'; 2 | 3 | function adder(){ 4 | const sheet = SpreadsheetApp.openById(ID).getSheetByName('add'); 5 | const data = sheet.getDataRange().getValues(); 6 | data.forEach((row,index) =>{ 7 | let total = 0; 8 | row.forEach(cell => { 9 | if(cell){ 10 | total = total + parseInt(cell); 11 | } 12 | }) 13 | const rowValue = index+1; 14 | const range = sheet.getRange(rowValue,row.length+1,1,1); 15 | range.setValue(total); 16 | }) 17 | } 18 | 19 | 20 | function makeNums(){ 21 | const ss = SpreadsheetApp.openById(ID); 22 | const sheet = ss.getSheetByName('add'); 23 | for(let i=0;i<20;i++){ 24 | const arr = [getRan(),getRan(),getRan()]; 25 | sheet.appendRow(arr); 26 | } 27 | Logger.log(sheet); 28 | } 29 | 30 | function getRan(){ 31 | return Math.floor(Math.random()*100); 32 | } 33 | -------------------------------------------------------------------------------- /2023Feb/Read sheet data and update: -------------------------------------------------------------------------------- 1 | function sheetData2(){ 2 | const sheet = SpreadsheetApp.openById(ID).getSheetByName('data'); 3 | const data = sheet.getDataRange().getValues(); 4 | const headings = data[0]; 5 | const results = data.slice(1); 6 | results.forEach((row,index) => { 7 | const days = (Math.floor(parseInt(row[1])/8)); 8 | sheet.getRange(index+2,3).setValue(days); 9 | }) 10 | //Logger.log(results); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /2023Feb/Send Notificaton Sheet: -------------------------------------------------------------------------------- 1 | function senderEmail(){ 2 | const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Users'); 3 | const data = sheet.getDataRange().getValues(); 4 | const users = data.slice(1); 5 | const today = new Date(); 6 | users.forEach((user,index) => { 7 | if(user[4]==''){ 8 | const date = new Date(user[3]); 9 | const diff = Math.round((date-today)/1000*60*60*24); 10 | const range = sheet.getRange(index+2,5); 11 | if(diff<0){ 12 | const email = user[1]; 13 | const subject = 'Passed'; 14 | const body = 'This is a reminder'; 15 | MailApp.sendEmail(email,subject,body); 16 | range.setValue(today); 17 | } 18 | Logger.log(diff); 19 | }else{ 20 | Logger.log(user[4]); 21 | } 22 | }) 23 | //Logger.log(users); 24 | } 25 | -------------------------------------------------------------------------------- /2023Feb/SendEmail PDF attach: -------------------------------------------------------------------------------- 1 | function sendMyEmail() { 2 | const email = Session.getActiveUser().getEmail(); 3 | const recEmail = email; 4 | const subject = 'Test Emailing'; 5 | const body = '

Laurence Svekis

This is an email sent by script

'; 6 | const id = '1SCE46vJBcWzMXCwhTBW_Hs_NC00LBIYWKFjiwZCXXVY'; 7 | const file = DriveApp.getFileById(id); 8 | const blob = Utilities.newBlob('My Content','text/html','myHTML.html'); 9 | /* 10 | GmailApp.sendEmail(recEmail,subject,body,{ 11 | from:email 12 | }); 13 | */ 14 | MailApp.sendEmail({ 15 | to:recEmail, 16 | subject:subject, 17 | name:'My Docs', 18 | htmlBody:body, 19 | attachments:[file.getAs(MimeType.PDF)] 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /2023Feb/Sheet Chart Borders and Styles Updates: -------------------------------------------------------------------------------- 1 | function formatSheetData(){ 2 | const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1]; 3 | sheet.getRange(1,4,1,1).setValue('Total'); 4 | const data = sheet.getDataRange().getValues(); 5 | const headerRange = sheet.getRange(1,1,1,data[0].length); 6 | headerRange.setFontWeight('bold'); 7 | headerRange.setFontSize(20); 8 | const borderRange = sheet.getRange(1,1,data.length,data[0].length); 9 | borderRange.setBorder(true,false,false,true,true,true,'black',SpreadsheetApp.BorderStyle.DOTTED); 10 | let total = 0; 11 | for(let i=1;i{ 8 | const start = event[1]; 9 | const nameEvent = event[0]; 10 | const end = event[2]; 11 | const loc = event[3]; 12 | const des = event[4]; 13 | const cal =CalendarApp.getDefaultCalendar(); 14 | const eve = cal.createEvent(nameEvent,start,end,{ 15 | location:loc, 16 | description:des 17 | }); 18 | Logger.log(cal); 19 | }) 20 | } 21 | 22 | function updateCal(){ 23 | const cal =CalendarApp.getDefaultCalendar(); 24 | const ss = SpreadsheetApp.openById(ID); 25 | const start = new Date(); 26 | const end = new Date(start.getTime() + (100*24*60*60*1000)); 27 | const events = cal.getEvents(start,end); 28 | Logger.log(events); 29 | const sheet = ss.insertSheet(); 30 | sheet.appendRow(['Name','Start','End','Location','ID']); 31 | sheet.setName('New Event List'); 32 | events.forEach(event => { 33 | const arr = [event.getTitle(),event.getStartTime(),event.getEndTime(),event.getLocation(),event.getId()]; 34 | sheet.appendRow(arr); 35 | }) 36 | } 37 | -------------------------------------------------------------------------------- /2023Feb/UI sort Asc or Des custom menu: -------------------------------------------------------------------------------- 1 | function onOpen(){ 2 | const menu = SpreadsheetApp.getUi().createMenu('My Menu'); 3 | menu.addItem('Sort Asc','sortAsc'); 4 | menu.addItem('Sort Des','sortDes'); 5 | menu.addToUi(); 6 | } 7 | 8 | function sortAsc(){ 9 | const sheet = SpreadsheetApp.getActiveSheet(); 10 | const range = sheet.getDataRange(); 11 | range.sort({column:1,ascending:true}); 12 | } 13 | 14 | function sortDes(){ 15 | const sheet = SpreadsheetApp.getActiveSheet(); 16 | const range = sheet.getDataRange(); 17 | range.sort({column:1,ascending:false}); 18 | } 19 | -------------------------------------------------------------------------------- /2023Feb/copy DOC bullets: -------------------------------------------------------------------------------- 1 | function copyBullets() { 2 | //const sourceDoc = DocumentApp.getActiveDocument(); 3 | const sourceDoc = DocumentApp.openById('1SCE46vJBcWzMXCwhTBW_Hs_NC00LBIYWKFjiwZCXXVY'); 4 | const listItems = sourceDoc.getBody().getListItems(); 5 | Logger.log(listItems); 6 | //const targetDoc = DocumentApp.create('New Doc Bullets'); 7 | const targetDoc = DocumentApp.openById('1KCKkFzMzSgHOvZJ18z_7W-MVMcTwguT8iHINHXlH-I4'); 8 | const targetBody = targetDoc.getBody(); 9 | for(let i=0;i{ 6 | Logger.log(row.length); 7 | }) 8 | Logger.log(data); 9 | } 10 | -------------------------------------------------------------------------------- /2023Feb/send email from sheet data: -------------------------------------------------------------------------------- 1 | function senderEmail(){ 2 | const sheet = SpreadsheetApp 3 | .openById(ID) 4 | .getSheetByName('Users'); 5 | const data = sheet.getDataRange().getValues(); 6 | const users = data.slice(1); 7 | Logger.log(users); 8 | users.forEach((user,index)=>{ 9 | const userName = user[0]; 10 | const email = user[2]; 11 | const id = user[1]; 12 | const message = `Hello ${userName}, your id is ${id}`; 13 | MailApp.sendEmail(email,'Welcome',message); 14 | }) 15 | 16 | } 17 | -------------------------------------------------------------------------------- /2023Feb/sheet custom function: -------------------------------------------------------------------------------- 1 | function addDiscount(cost,dis) { 2 | let price = cost - (cost * dis); 3 | let dlr = Intl.NumberFormat('en-US',{ 4 | style:'currency', 5 | currency:'USD' 6 | }) 7 | return dlr.format(price); 8 | } 9 | -------------------------------------------------------------------------------- /2023Feb/use form data in email: -------------------------------------------------------------------------------- 1 | function onFormSubmit(e){ 2 | const vals = e.namedValues; 3 | const subject = 'New Form Submission'; 4 | const email = 'gappscourses@gmail.com'; 5 | const message = JSON.stringify(vals); 6 | const body = `Message ${vals.message[0]} Name ${vals.name[0]} Name ${vals["Email Address"][0]}`; 7 | MailApp.sendEmail(email,subject,body); 8 | } 9 | -------------------------------------------------------------------------------- /2023Feb/write to sheet: -------------------------------------------------------------------------------- 1 | function writeData(){ 2 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 | const sheets = ss.getSheets(); 4 | Logger.log(sheets); 5 | const sheet = sheets[2]; 6 | //const sheet = ss.getSheetByName('Sheet2'); 7 | //const sheet = SpreadsheetApp.getActiveSheet(); 8 | const data = [['Name','ID'],['Laurence','100'],['Laura','50'],['John','1140']]; 9 | const lastRow = sheet.getLastRow(); 10 | Logger.log(lastRow); 11 | const range = sheet.getRange(lastRow+1,1,data.length,data[0].length); 12 | range.setValues(data); 13 | } 14 | -------------------------------------------------------------------------------- /2023Mar/Create Slide update text in slide: -------------------------------------------------------------------------------- 1 | function makeSlides(){ 2 | const pre = SlidesApp.create('Laurence Test2'); 3 | const slide = pre.getSlides()[0]; 4 | slide.insertTextBox('Laurence Svekis',20,20,250,250); 5 | } 6 | 7 | function upSlides(){ 8 | const id = '1qTkK20Av6Rm5w6fO3ey48'; 9 | const pre = SlidesApp.openById(id); 10 | const slide = pre.getSlides()[0]; 11 | const eles = slide.getShapes(); 12 | eles.forEach(ele =>{ 13 | Logger.log(ele.getText().asString()); 14 | ele.getText().replaceAllText('Laurence','Mr'); 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /2023Mar/EMail HTML table from sheet data: -------------------------------------------------------------------------------- 1 | function tableMaker(){ 2 | const id = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 3 | const sheet = SpreadsheetApp.openById(id).getSheetByName('users'); 4 | const data = sheet.getDataRange().getValues(); 5 | const header = data[0]; 6 | const rows = data.slice(1); 7 | let html = ''; 8 | data.forEach(row=>{ 9 | html += ''; 10 | row.forEach(cell=>{ 11 | html += ''; 12 | }) 13 | html += ''; 14 | }) 15 | html += '
'+cell+'
'; 16 | const email = Session.getActiveUser().getEmail(); 17 | const subject = 'My Table'; 18 | MailApp.sendEmail({ 19 | to:email, 20 | subject:subject, 21 | htmlBody:html 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /2023Mar/Form Data: -------------------------------------------------------------------------------- 1 | function getMyData(){ 2 | const id = '1Es22J95HkuZPmPmbkJRfMZ4MpnwFRGvddGxR8gcPFJU'; 3 | const sid = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 4 | const ss = SpreadsheetApp.openById(sid).getSheetByName('data'); 5 | const form = FormApp.openById(id); 6 | const responses = form.getResponses(); 7 | responses.forEach(response =>{ 8 | Logger.log(response.getItemResponses()); 9 | const items = response.getItemResponses(); 10 | items.forEach(item=>{ 11 | const question = item.getItem().getTitle(); 12 | const answer = item.getResponse(); 13 | ss.appendRow([`Question:${question}`,`Answer:${answer}`]); 14 | Logger.log(`Question:${question} Answer:${answer}`); 15 | }) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /2023Mar/PDF of single Sheet: -------------------------------------------------------------------------------- 1 | function conSheet(){ 2 | const id = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 3 | const ss = SpreadsheetApp.openById(id); 4 | const sheets = ss.getSheets(); 5 | const sheetName = 'quotes'; 6 | sheets.forEach(sheet =>{ 7 | if(sheet.getName()!=sheetName){ 8 | sheet.hideSheet(); 9 | } 10 | }) 11 | const blob = ss.getBlob().getAs('application/pdf').setName(`${sheetName}.pdf`); 12 | DriveApp.createFile(blob); 13 | sheets.forEach(sheet =>{ 14 | if(sheet.getName()!=sheetName){ 15 | sheet.showSheet(); 16 | } 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /2023Mar/Sheet Data as JSON web App Output: -------------------------------------------------------------------------------- 1 | function getUserInfo(id){ 2 | const sid = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 3 | const sheet = SpreadsheetApp.openById(sid).getSheetByName('users'); 4 | const data = sheet.getDataRange().getValues().slice(1); 5 | let rep = null; 6 | data.forEach(ele =>{ 7 | if(ele[2] == id){ 8 | rep = {name:ele[0],email:ele[1],id:ele[2],status:ele[3]} 9 | }; 10 | }) 11 | return rep; 12 | } 13 | 14 | function tester(){ 15 | Logger.log(getUserInfo(3)); 16 | } 17 | 18 | function doGet(e){ 19 | let data = null; 20 | if('id' in e.parameters){ 21 | let val = e.parameters['id'][0]; 22 | data = getUserInfo(val); 23 | } 24 | const output = JSON.stringify(data); 25 | return ContentService.createTextOutput(output).setMimeType(ContentService.MimeType.JSON); 26 | } 27 | -------------------------------------------------------------------------------- /2023Mar/add slide update chart from sheet to slide: -------------------------------------------------------------------------------- 1 | function makeSlides(){ 2 | const title = 'Laurence Svekis'; 3 | const slides = SlidesApp.create(title); 4 | const slide = slides.getSlides()[0]; 5 | slide.insertTextBox(title); 6 | const slide2 = slide.duplicate(); 7 | } 8 | 9 | function upSlides(){ 10 | const id = '1AArjO5fgaNtf-iFWmhslNZTSOh1ZnGWmicIPFDsaC4k'; 11 | const slides = SlidesApp.openById(id); 12 | const slide1 = slides.getSlides()[0]; 13 | const sid = '132trziyDq_foIdRW0vciq2rm2NT-UKvLa8IvLsk8qIk'; 14 | const sheet = SpreadsheetApp.openById(sid).getSheetByName('data'); 15 | const chart = sheet.getCharts()[0]; 16 | Logger.log(chart); 17 | slide1.insertSheetsChartAsImage(chart); 18 | } 19 | -------------------------------------------------------------------------------- /2023Mar/create a form with code: -------------------------------------------------------------------------------- 1 | function makeForm(){ 2 | const form = FormApp.create('Laurence Test'); 3 | form.addTextItem() 4 | .setTitle('Whats your name') 5 | .setRequired(true); 6 | const item1 = form.addMultipleChoiceItem(); 7 | item1.setTitle('Your Favorite Color') 8 | .setChoices([ 9 | item1.createChoice('Red'), 10 | item1.createChoice('Blue'), 11 | item1.createChoice('Green'), 12 | item1.createChoice('Yellow') 13 | ]) 14 | Logger.log(form.getPublishedUrl()); 15 | } 16 | -------------------------------------------------------------------------------- /2023Mar/create and copy files into new folder: -------------------------------------------------------------------------------- 1 | function cpyFolder(){ 2 | const folderID = '17hhl91aZY1pM0S8dD41Hgz30_8u_O1Uc'; 3 | const folder = DriveApp.getFolderById(folderID); 4 | const newName = 'Laurence'; 5 | const newFolder = DriveApp.createFolder(newName); 6 | const files = folder.getFiles(); 7 | while(files.hasNext()){ 8 | const file = files.next(); 9 | file.makeCopy(file.getName(),newFolder); 10 | } 11 | Logger.log(folder); 12 | } 13 | -------------------------------------------------------------------------------- /2023Mar/create files list folder file contents to sheet: -------------------------------------------------------------------------------- 1 | function dataFolder(){ 2 | const sid = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 3 | const id = '1a591VSrO-dj11PJk04cm6PtpiRVepssw'; 4 | const folder = DriveApp.getFolderById(id); 5 | const sheet = SpreadsheetApp.openById(sid).getSheetByName('files'); 6 | const files = folder.getFiles(); 7 | Logger.log(files); 8 | while (files.hasNext()){ 9 | const file = files.next(); 10 | sheet.appendRow([file.getName(),file.getId(),file.getSize()]); 11 | Logger.log(file.getName()); 12 | } 13 | } 14 | 15 | function newFiles(){ 16 | const id = '1a591VSrO-dj11PJk04cm6PtpiRVepssw'; 17 | const folder = DriveApp.getFolderById(id); 18 | const doc = DocumentApp.create('new Doc'); 19 | const docID = doc.getId(); 20 | const file = DriveApp.getFileById(docID); 21 | file.moveTo(folder); 22 | } 23 | 24 | function newFiles2(){ 25 | const folder = DriveApp.getFolderById('1a591VSrO-dj11PJk04cm6PtpiRVepssw'); 26 | const doc = DocumentApp.create('new Doc 2'); 27 | DriveApp.getFileById(doc.getId()).moveTo(folder); 28 | } 29 | -------------------------------------------------------------------------------- /2023Mar/data from form: -------------------------------------------------------------------------------- 1 | function getMyData(){ 2 | const id = '1Es22J95HkuZPmPmbkJRfMZ4MpnwFRGvddGxR8gcPFJU'; 3 | const sid = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 4 | const ss = SpreadsheetApp.openById(sid).getSheetByName('data'); 5 | const form = FormApp.openById(id); 6 | const responses = form.getResponses(); 7 | responses.forEach(response =>{ 8 | Logger.log(response.getItemResponses()); 9 | const items = response.getItemResponses(); 10 | items.forEach(item=>{ 11 | const question = item.getItem().getTitle(); 12 | const answer = item.getResponse(); 13 | ss.appendRow([`Question:${question}`,`Answer:${answer}`]); 14 | Logger.log(`Question:${question} Answer:${answer}`); 15 | }) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /2023Mar/email file as attachment: -------------------------------------------------------------------------------- 1 | function sendAtt(){ 2 | const id = '1SCE46vJBcWzMXCwhTBW_Hs_NC00LBIYWKFjiwZCXXVY'; 3 | const rep = Session.getActiveUser().getEmail(); 4 | const sub = 'Test Email'; 5 | const body = 'Hello World Testing....'; 6 | const att = DriveApp.getFileById(id); 7 | MailApp.sendEmail(rep,sub,body,{ 8 | attachments:[att] 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /2023Mar/modify sheet data: -------------------------------------------------------------------------------- 1 | function modData(){ 2 | const id = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 3 | const sheet = SpreadsheetApp.openById(id).getSheetByName('users'); 4 | const data = sheet.getDataRange().getValues(); 5 | data.forEach((row,index)=>{ 6 | if(row[0] == 'Laurence'){ 7 | const range = sheet.getRange(index+1,1); 8 | range.setBackground('blue'); 9 | //range.setValue('Active'); 10 | } 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /2023Mar/send sheet data emails: -------------------------------------------------------------------------------- 1 | function sender(){ 2 | const id = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 3 | const sheet = SpreadsheetApp.openById(id).getSheetByName('users'); 4 | const data = sheet.getDataRange().getValues(); 5 | const users = data.slice(1); 6 | users.forEach(user =>{ 7 | const email = user[1]; 8 | const message = `Dear ${user[0]} \n\nThis is a test!`; 9 | const subject = `Info for ID ${user[2]}`; 10 | MailApp.sendEmail(email,subject,message); 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /2023Mar/translate quotes: -------------------------------------------------------------------------------- 1 | const ID = '1P9R_b-dTdoBAAWAGF6kPZyKSXJ6r2P_LFgrKeReNmrY'; 2 | function textTranslator(){ 3 | const textEng = 'Hello World'; 4 | const targetLang = 'es'; 5 | const newText = LanguageApp.translate(textEng,'en',targetLang); 6 | Logger.log(newText); 7 | } 8 | 9 | function sheetQuotes(){ 10 | const ss = SpreadsheetApp.openById(ID).getSheetByName('quotes'); 11 | const data = ss.getDataRange().getValues(); 12 | Logger.log(data); 13 | const lang = 'is'; 14 | data.forEach((quote,index)=>{ 15 | const newText = LanguageApp.translate(quote,'en',lang); 16 | Logger.log(newText); 17 | const range = ss.getRange(index+1,2); 18 | range.setValue(newText); 19 | }) 20 | } 21 | -------------------------------------------------------------------------------- /2023Mar/update doc element style: -------------------------------------------------------------------------------- 1 | function modDoc(){ 2 | const id = '1SCE46vJBcWzMXCwhTBW_Hs_NC00LBIYWKFjiwZCXXVY'; 3 | const doc = DocumentApp.openById(id); 4 | const body = doc.getBody(); 5 | const paras = body.getParagraphs(); 6 | const style = {}; 7 | style[DocumentApp.Attribute.BOLD] = true; 8 | style[DocumentApp.Attribute.FONT_SIZE] = 18; 9 | paras.forEach(para =>{ 10 | if(para.getText().indexOf('Lorem ipsum') !== -1){ 11 | para.setAttributes(style); 12 | } 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /2023Mar/update form values: -------------------------------------------------------------------------------- 1 | function modForm(){ 2 | const id = '1Q1Z70eKxs1e5kiR03YOQFAmapQivYx77nOZTSUposHg'; 3 | const form = FormApp.openById(id); 4 | const items = form.getItems(); 5 | items.forEach(item =>{ 6 | Logger.log(item.getTitle()); 7 | }) 8 | const mul = items[1].asMultipleChoiceItem(); 9 | mul.setChoiceValues(['Purple','Pink','Teal']); 10 | } 11 | -------------------------------------------------------------------------------- /APPS SCRIPT/CalendarApp Methods for Google Calenda: -------------------------------------------------------------------------------- 1 | function cal5(){ 2 | const id = '7lcmefedab3a82sd9n59k0odi8@google.com'; 3 | const cal = CalendarApp.getDefaultCalendar(); 4 | const day = new Date('2/18/2022'); 5 | const events = cal.getEventsForDay(day); 6 | Logger.log(events); 7 | events.forEach(event=>{ 8 | Logger.log(event.getId()); 9 | Logger.log(event.getTitle()); 10 | const ev = cal.getEventById(event.getId()); 11 | Logger.log(ev.getColor()); 12 | ev.setTag('test','New'); 13 | }) 14 | const event = cal.getEventById(id); 15 | event.setDescription('New updated'); 16 | event.setTitle('Another Title'); 17 | event.setColor("8"); 18 | event.addGuest('gappscourses+5@gmail.com'); 19 | } 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | function acal5(){ 33 | const id = 'o50rtf0dei8o3lbshg6rfthrtk@google.com'; 34 | const cal = CalendarApp.getDefaultCalendar(); 35 | const day = new Date('2/18/2022'); 36 | const events = cal.getEventsForDay(day); 37 | Logger.log(events); 38 | events.forEach(event=>{ 39 | Logger.log(event.getId()); 40 | const ev = cal.getEventById(event.getId()); 41 | Logger.log(ev); 42 | }) 43 | 44 | const event = cal.getEventById(id); 45 | Logger.log(event); 46 | event.setDescription('New updated'); 47 | event.setColor("10"); 48 | event.addGuest('gappscourses+5@gmail.com'); 49 | 50 | } 51 | 52 | 53 | 54 | 55 | 56 | function cal4(){ 57 | const cal = CalendarApp.getDefaultCalendar(); 58 | const start = new Date('2/18/2022 20:00:00 UTC'); 59 | const end = new Date('2/18/2022 22:00:00 UTC'); 60 | const opts = { 61 | description : 'This is my event', 62 | location : 'Toronto', 63 | guests :'gappscourses+10@gmail.com,gappscourses+8@gmail.com', 64 | sendInvites : true 65 | }; 66 | const event = cal.createEvent('New Event 2',start,end,opts); 67 | Logger.log(event.getId()); 68 | } 69 | 70 | 71 | 72 | 73 | 74 | 75 | function cal3(){ 76 | const cal = CalendarApp.getDefaultCalendar(); 77 | const day = new Date('2/17/2022'); 78 | const events = cal.getEventsForDay(day); 79 | Logger.log(events); 80 | const event = events[0]; 81 | const list = event.getGuestList(); 82 | list.forEach(guest =>{ 83 | Logger.log(guest.getEmail()); 84 | Logger.log(guest.getStatus()); 85 | const subject = event.getTitle(); 86 | let body = `You have been invited Check you calendar for ${day} ${event.getDescription()}`; 87 | if(guest.getStatus() === 'invited'){ 88 | MailApp.sendEmail(guest.getEmail(),subject,body); 89 | } 90 | }) 91 | //events[0].addGuest('gappscourses+12@gmail.com'); 92 | } 93 | 94 | 95 | 96 | 97 | function cal2(){ 98 | const cal = CalendarApp.getDefaultCalendar(); 99 | //Logger.log(cal.getName()); 100 | const start = new Date('1/1/2022'); 101 | const end = new Date('1/1/2023'); 102 | //Logger.log(start); 103 | //Logger.log(end); 104 | const opt = { 105 | max : 10, 106 | search : 'Test' 107 | }; 108 | const events = cal.getEvents(start,end,opt); 109 | //Logger.log(events); 110 | events.forEach(event =>{ 111 | Logger.log(event.getTitle()); 112 | Logger.log(event.isOwnedByMe()); 113 | //event.addGuest('gappscourses+10@gmail.com'); 114 | const list = event.getGuestList(); 115 | list.forEach(guest =>{ 116 | Logger.log(guest.getEmail()); 117 | Logger.log(guest.getStatus()); 118 | }) 119 | Logger.log(list); 120 | }) 121 | 122 | } 123 | 124 | 125 | 126 | 127 | 128 | function cal1() { 129 | const cals = CalendarApp.getAllCalendars(); 130 | Logger.log(cals); 131 | cals.forEach(cal =>{ 132 | Logger.log(cal.getName()); 133 | }) 134 | } 135 | -------------------------------------------------------------------------------- /APPS SCRIPT/Conditional Rules Format: -------------------------------------------------------------------------------- 1 | function updater5() { 2 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 3 | const ss = SpreadsheetApp.openById(id); 4 | const sheet = ss.getSheetByName('test1'); 5 | const rules = sheet.getConditionalFormatRules(); 6 | const range1 = sheet.getRange('A2:D9'); 7 | const con1 = SpreadsheetApp.newConditionalFormatRule() 8 | .whenNumberBetween(0, 500) 9 | .setBackground('#0000FF') 10 | .setRanges([range1]) 11 | .build(); 12 | rules[0] = con1; 13 | sheet.setConditionalFormatRules(rules); 14 | } 15 | 16 | function updater4() { 17 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 18 | const ss = SpreadsheetApp.openById(id); 19 | const sheet = ss.getSheetByName('test1'); 20 | sheet.clearConditionalFormatRules(); 21 | const rules = sheet.getConditionalFormatRules(); 22 | Logger.log(rules); 23 | const range1 = sheet.getRange('A2:C9'); 24 | const con1 = SpreadsheetApp.newConditionalFormatRule() 25 | .whenNumberBetween(0, 500) 26 | .setBackground('#00FF00') 27 | .setRanges([range1]) 28 | .build(); 29 | rules.push(con1); 30 | sheet.setConditionalFormatRules(rules); 31 | } 32 | 33 | function updater3() { 34 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 35 | const ss = SpreadsheetApp.openById(id); 36 | const sheet = ss.getSheetByName('test1'); 37 | const rules = sheet.getConditionalFormatRules(); 38 | rules.forEach(rule => { 39 | Logger.log(rule.getRanges()); 40 | /* 41 | const ranges = rule.getRanges(); 42 | for (let i = 0; i < ranges.length; i++) { 43 | Logger.log(ranges[i].getA1Notation()); 44 | ranges[i].setFontColor('#00ff00'); 45 | } 46 | */ 47 | const boo = rule.getBooleanCondition(); 48 | Logger.log(rule.getBooleanCondition().getBackground()); 49 | Logger.log(rule.getGradientCondition()); 50 | }) 51 | Logger.log(rules); 52 | } 53 | 54 | 55 | 56 | 57 | function updater2() { 58 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 59 | const ss = SpreadsheetApp.openById(id); 60 | const sheet = ss.getSheetByName('test1'); 61 | Logger.log(sheet.getName()); 62 | const range1 = sheet.getRange('A2:C9'); 63 | Logger.log(range1.getValues()); 64 | const con1 = SpreadsheetApp.newConditionalFormatRule() 65 | .whenNumberBetween(0, 500) 66 | .setBackground('#dddddd') 67 | .setRanges([range1]) 68 | .build(); 69 | const rules = sheet.getConditionalFormatRules(); 70 | Logger.log(rules); 71 | rules.push(con1); 72 | sheet.setConditionalFormatRules(rules); 73 | 74 | } 75 | -------------------------------------------------------------------------------- /APPS SCRIPT/Doc Template PDF: -------------------------------------------------------------------------------- 1 | function sender1(){ 2 | const destID = '1HYWG2U5chl_lXoV5tqR-B5Vq6JAkxnba'; 3 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 4 | const sheetID = '1G7yTIKlDP90aXC12tCXOZ_5QLgxE_QI0hwpDQCDDWgM' 5 | 6 | const destFolder = DriveApp.getFolderById(destID); 7 | const tempDoc = DriveApp.getFileById(tempID ); 8 | const ss = SpreadsheetApp.openById(sheetID); 9 | const sheet = ss.getSheets()[0]; 10 | const data = sheet.getDataRange().getValues(); 11 | const rows = data.slice(1); 12 | rows.forEach((row,index)=>{ 13 | if(!row[4]){ 14 | Logger.log(row[0]); 15 | const newDoc = tempDoc.makeCopy(row[0],destFolder); 16 | const doc = DocumentApp.openById(newDoc.getId()); 17 | const body = doc.getBody(); 18 | data[0].forEach((heading,col)=>{ 19 | const tempHeading = heading.toUpperCase(); 20 | body.replaceText(`{${tempHeading}}`,row[col]); 21 | }) 22 | doc.saveAndClose(); 23 | const blob = doc.getAs(MimeType.PDF); 24 | destFolder.createFile(blob).setName(row[0]+'.pdf'); 25 | const email = row[3]; 26 | const subject = row[0]+row[1]+' Your doc'; 27 | const hbody = `Hi ${row[0]} Welcome your id ${row[2]}`; 28 | 29 | MailApp.sendEmail({ 30 | to:email,subject:subject,htmlBody:hbody,attachments:[blob.getAs(MimeType.PDF)] 31 | }); 32 | newDoc.setTrashed(true); 33 | const temp = sheet.getRange(index+2,5,1,1); 34 | temp.setValue(true); 35 | 36 | }; 37 | }) 38 | 39 | } 40 | 41 | 42 | 43 | function makerPDFs1(){ 44 | const fid = '1f6jFkkEhxhvUtP7gY-3-vMrfANle6DJG'; 45 | const did = '1HYWG2U5chl_lXoV5tqR-B5Vq6JAkxnba'; 46 | const sourceF = DriveApp.getFolderById(fid); 47 | const sourceD = DriveApp.getFolderById(did); 48 | const files = sourceF.getFiles(); 49 | while(files.hasNext()){ 50 | const file = files.next(); 51 | //const blob = file.makeCopy(sourceD).getAs(MimeType.PDF); 52 | const blob = file.getBlob(); 53 | const pdf = sourceD.createFile(blob).setName(file.getName()+'.pdf'); 54 | } 55 | } 56 | 57 | function makerPDF1(){ 58 | const folderID ='1f6jFkkEhxhvUtP7gY-3-vMrfANle6DJG'; 59 | const desFolder = DriveApp.getFolderById(folderID); 60 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 61 | const tempDoc = DriveApp.getFileById(tempID ); 62 | const newDoc = tempDoc.makeCopy('test1',desFolder); 63 | const blob = newDoc.getAs(MimeType.PDF); 64 | const pdf = desFolder.createFile(blob).setName('test1.pdf'); 65 | } 66 | 67 | 68 | function updateDoc3() { 69 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 70 | const sheetID = '1G7yTIKlDP90aXC12tCXOZ_5QLgxE_QI0hwpDQCDDWgM' 71 | const tempDoc = DriveApp.getFileById(tempID ); 72 | const ss = SpreadsheetApp.openById(sheetID); 73 | const sheet = ss.getSheets()[0]; 74 | const data = sheet.getDataRange().getValues(); 75 | const rows = data.slice(1); 76 | rows.forEach((row,index)=>{ 77 | const newDoc = tempDoc.makeCopy(row[0]); 78 | const body = DocumentApp.openById(newDoc.getId()).getBody(); 79 | data[0].forEach((heading,col)=>{ 80 | const tempHeading = heading.toUpperCase(); 81 | body.replaceText(`{${tempHeading}}`,row[col]); 82 | }) 83 | const temp = sheet.getRange(index+2,5,1,1); 84 | temp.setValue(true); 85 | }) 86 | } 87 | 88 | 89 | 90 | function testData1(){ 91 | const sheetID = '1G7yTIKlDP90aXC12tCXOZ_5QLgxE_QI0hwpDQCDDWgM' 92 | const ss = SpreadsheetApp.openById(sheetID); 93 | const sheet = ss.getSheets()[0]; 94 | const data = sheet.getDataRange().getValues(); 95 | const rows = data.slice(1); 96 | rows.forEach((row,index)=>{ 97 | Logger.log(row); 98 | const temp = sheet.getRange(index+2,5,1,1); 99 | temp.setValue(false); 100 | }) 101 | //Logger.log(rows); 102 | } 103 | 104 | 105 | function updateDoc2() { 106 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 107 | const tempDoc = DriveApp.getFileById(tempID ); 108 | const newDoc = tempDoc.makeCopy('new 2'); 109 | const doc = DocumentApp.openById(newDoc.getId()); 110 | const body = doc.getBody(); 111 | const user = {first:'Laurence',last:'Svekis',id:15} 112 | body.replaceText('{FIRST}',user.first); 113 | body.replaceText('{LAST}',user.last); 114 | body.replaceText('{ID}',user.id); 115 | } 116 | 117 | 118 | 119 | function updateDoc1() { 120 | const id = '1wHdzWZnt_W4y-93k-_T_ZLrDzqc06QIYx45-CW7iL8c'; 121 | const doc = DocumentApp.openById(id); 122 | const body = doc.getBody(); 123 | Logger.log(body); 124 | const user = {first:'Laurence',last:'Svekis',id:15} 125 | body.replaceText('{FIRST}',user.first); 126 | body.replaceText('{LAST}',user.last); 127 | body.replaceText('{ID}',user.id); 128 | } 129 | -------------------------------------------------------------------------------- /APPS SCRIPT/Doc and file maker Macros: -------------------------------------------------------------------------------- 1 | function MakeRed() { 2 | var spreadsheet = SpreadsheetApp.getActive(); 3 | spreadsheet.getRange('A1:A4').activate(); 4 | spreadsheet.getActiveRangeList().setFontColor('blue'); 5 | }; 6 | 7 | function makePurpleText() { 8 | var spreadsheet = SpreadsheetApp.getActive(); 9 | spreadsheet.getRange('A1:C4').activate(); 10 | spreadsheet.getActiveRangeList().setFontColor('purple').setBackground('yellow'); 11 | }; 12 | 13 | function MyMacro() { 14 | var spreadsheet = SpreadsheetApp.getActive(); 15 | spreadsheet.getRange('A1:A4').activate(); 16 | spreadsheet.getActiveRangeList().setFontColor('blue'); 17 | }; 18 | 19 | 20 | function sheetDataTest() { 21 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 22 | const sheet = ss.getActiveSheet(); 23 | //Logger.log(sheet.getSheetName()); 24 | const range = sheet.getDataRange(); 25 | //Logger.log(range.getValues()); 26 | const res = range.getValues(); 27 | const data = res.slice(1); 28 | /*for(let i=0;i{ 32 | //Logger.log(row[3]); 33 | const message = `Hi, ${row[0]} ${row[1]}

Welcome to the site.


34 |
Your id is

${row[2]}

`; 35 | const email = row[3]; 36 | const subject = `Test email ID ${row[2]}`; 37 | //Logger.log(message); 38 | //MailApp.sendEmail(email,subject,message); 39 | MailApp.sendEmail({ 40 | to : email, 41 | subject : subject, 42 | htmlBody : message 43 | }); 44 | }) 45 | 46 | } 47 | 48 | function myData(){ 49 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 50 | const sheet = ss.getSheetByName('data'); 51 | const rows = sheet.getDataRange().getValues(); 52 | const data = rows.slice(1); 53 | data.forEach((row,ind)=>{ 54 | const val = makerDoc(row,ind); 55 | const updateRange = sheet.getRange(val.row,5); 56 | updateRange.setValue(val.message); 57 | 58 | }) 59 | //Logger.log(data); 60 | } 61 | 62 | function makerDoc(data,ind){ 63 | //Logger.log(data); 64 | const rowVal = ind + 2; 65 | let message = `${data[0]} ${data[1]}`; 66 | const docName = `${data[0]} ${data[1]} ${rowVal}`; 67 | const doc = DocumentApp.create(docName); 68 | const bodyData = `${docName} Hello and Welcome. your id is ${data[2]}`; 69 | const body = doc.getBody(); 70 | body.appendParagraph(bodyData); 71 | const url = doc.getUrl(); 72 | message += ` Your doc is located at ${url}`; 73 | body.appendParagraph(message); 74 | const email = data[3]; 75 | const subject = `${docName} created`; 76 | const emailBody = `Your doc is created at ${url}`; 77 | MailApp.sendEmail(email,subject,emailBody); 78 | //Logger.log(docName); 79 | return {row:rowVal,message:message}; 80 | } 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /APPS SCRIPT/DocumentApp: -------------------------------------------------------------------------------- 1 | function updateDoc(){ 2 | const id = '1i6Ybb7rvAtYrUAYgi0rCNKnw_qJmdlHv_NteVkQ_zLw'; 3 | const doc = DocumentApp.openById(id); 4 | Logger.log(doc.getName()); 5 | const body = doc.getBody(); 6 | body.clear(); 7 | const heading = body.appendParagraph('Laurence Svekis'); 8 | Logger.log(heading); 9 | heading.setHeading(DocumentApp.ParagraphHeading.HEADING1); 10 | const style = {}; 11 | style[DocumentApp.Attribute.FOREGROUND_COLOR] = '#ff0000'; 12 | style[DocumentApp.Attribute.FONT_FAMILY] = 'Calibri'; 13 | 14 | const style1 = {}; 15 | style1[DocumentApp.Attribute.FOREGROUND_COLOR] = '#000000'; 16 | 17 | 18 | const myTable = [ 19 | ['Col 1','Col 2','Col 3'], 20 | ['1','Laurence','Svekis'], 21 | ['2','Jane','Doe'] 22 | ]; 23 | const tab1 = body.appendTable(myTable); 24 | tab1.setAttributes(style1); 25 | Logger.log(tab1); 26 | //tab1.appendTableRow().appendTableCell('3'); 27 | const arr = ['3','Jack','Jones']; 28 | const row = tab1.appendTableRow(); 29 | Logger.log(row); 30 | arr.forEach((ele)=>{ 31 | row.appendTableCell(ele); 32 | }) 33 | 34 | body.appendHorizontalRule(); 35 | const url = 'http://www.discoveryvip.com/img/d.png'; 36 | const img = UrlFetchApp.fetch(url); 37 | body.appendImage(img); 38 | 39 | 40 | const list1 = body.appendListItem('New item 1'); 41 | Logger.log(list1.getListId()); 42 | list1.appendText(' more text'); 43 | body.appendHorizontalRule(); 44 | for(let i=0;i<10;i++){ 45 | const li = body.appendListItem(`Item ${i}`); 46 | li.setListId(list1); 47 | } 48 | const myLi = body.getChildIndex(list1); 49 | Logger.log(myLi); 50 | const newLi = body.insertListItem(myLi+1,'New Item ADDED**'); 51 | for(let i=0;i<5;i++){ 52 | const li = body.insertListItem(myLi+2+i,`NEW!!!!! ${i}`); 53 | } 54 | const par1 = body.appendParagraph('Hello World'); 55 | Logger.log(par1); 56 | par1.appendText('Add New Text'); 57 | heading.setAttributes(style); 58 | } 59 | 60 | 61 | 62 | 63 | function makeDoc() { 64 | const doc = DocumentApp.create('New Doc 1'); 65 | Logger.log(doc.getUrl()); 66 | Logger.log(doc.getId()); 67 | } 68 | -------------------------------------------------------------------------------- /APPS SCRIPT/DriveApp Service: -------------------------------------------------------------------------------- 1 | function maker4() { 2 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 3 | const main = DriveApp.getFolderById(id); 4 | for (let i = 0; i < 5; i++) { 5 | const temp = `File ${i + 1}.txt`; 6 | const content = `Laurence Svekis ${i + 1}`; 7 | const file = main.createFile(temp, content, MimeType.PLAIN_TEXT); 8 | Logger.log(file.getOwner().getEmail()); 9 | file.addEditor('gappscourses+5@gmail.com'); 10 | Logger.log(file.getEditors()); 11 | } 12 | } 13 | 14 | function sel2() { 15 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 16 | const main = DriveApp.getFolderById(id); 17 | const files = main.getFiles(); 18 | while (files.hasNext()) { 19 | const file = files.next(); 20 | //Logger.log(file.getName()); 21 | //Logger.log(file.getMimeType()); 22 | Logger.log(file.isTrashed()); 23 | Logger.log(file.isStarred()); 24 | Logger.log('text/plain' == MimeType.PLAIN_TEXT) 25 | if (file.getMimeType() != MimeType.PLAIN_TEXT) { 26 | file.setTrashed(true); 27 | } else { 28 | file.setTrashed(true); 29 | file.setStarred(false); 30 | } 31 | } 32 | } 33 | 34 | function maker3() { 35 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 36 | const main = DriveApp.getFolderById(id); 37 | for (let i = 0; i < 5; i++) { 38 | const temp = `File ${i + 1}`; 39 | const content = `Laurence Svekis ${i + 1}`; 40 | const file = main.createFile(temp, content); 41 | Logger.log(file.getOwner().getEmail()); 42 | file.addEditor('gappscourses+5@gmail.com'); 43 | Logger.log(file.getEditors()); 44 | } 45 | } 46 | 47 | function sel1() { 48 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 49 | const main = DriveApp.getFolderById(id); 50 | main.addEditor('gappscourses+9@gmail.com'); 51 | const editors = main.getEditors(); 52 | Logger.log(editors); 53 | editors.forEach(editor => { 54 | Logger.log(editor.getEmail()); 55 | }) 56 | const folders = main.getFolders(); 57 | //Logger.log(folders); 58 | //Logger.log(folders.hasNext()) 59 | while (folders.hasNext()) { 60 | const folder = folders.next(); 61 | Logger.log(folder.getName()); 62 | } 63 | 64 | } 65 | 66 | function maker2() { 67 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 68 | const main = DriveApp.getFolderById(id); 69 | for (let i = 0; i < 5; i++) { 70 | const temp = `Folder ${i + 1}`; 71 | const folder = main.createFolder(temp); 72 | Logger.log(folder.getOwner().getEmail()); 73 | folder.addEditor('gappscourses+5@gmail.com'); 74 | Logger.log(folder.getEditors()); 75 | } 76 | } 77 | 78 | function maker1() { 79 | const folder = DriveApp.createFolder('New Folder'); 80 | Logger.log(folder.getId()); 81 | } 82 | -------------------------------------------------------------------------------- /APPS SCRIPT/Files and Folders in Drive: -------------------------------------------------------------------------------- 1 | function maker3() { 2 | const id = '1U85PLCGjVZCOUlGW9xX1h9HBcdH6QqTb'; 3 | const main = DriveApp.getFolderById(id); 4 | const ss = SpreadsheetApp.create('New Sheet'); 5 | const fid = ss.getId(); 6 | const file = DriveApp.getFileById(fid); 7 | Logger.log(file); 8 | file.moveTo(main); 9 | } 10 | 11 | function maker2() { 12 | const id = '1U85PLCGjVZCOUlGW9xX1h9HBcdH6QqTb'; 13 | const main = DriveApp.getFolderById(id); 14 | const doc = DocumentApp.create('Test'); 15 | const fid = doc.getId(); 16 | const file = DriveApp.getFileById(fid); 17 | Logger.log(file); 18 | file.moveTo(main); 19 | } 20 | 21 | function maker1() { 22 | const fid = '1efWWo8JAph3hZIc3vZoYAToQ2vrWAdb1'; 23 | const file = DriveApp.getFileById(fid); 24 | const blob = file.getBlob(); 25 | const email = Session.getActiveUser().getEmail(); 26 | let html = `

New File as PDF

`; 27 | html += `
Your file is at ${file.getUrl()}
`; 28 | MailApp.sendEmail({ 29 | to: email, 30 | subject: file.getName(), 31 | htmlBody: html, 32 | attachments: [blob.getAs(MimeType.PDF)] 33 | }); 34 | } 35 | 36 | function sel5() { 37 | const fid = '1efWWo8JAph3hZIc3vZoYAToQ2vrWAdb1'; 38 | const id = '1U85PLCGjVZCOUlGW9xX1h9HBcdH6QqTb'; 39 | const files = DriveApp.getFilesByName('New 8.html'); 40 | const file = DriveApp.getFileById(fid); 41 | while (files.hasNext()) { 42 | const file = files.next(); 43 | Logger.log(file.getId()); 44 | } 45 | Logger.log(files); 46 | Logger.log(file); 47 | const editors = file.getEditors(); 48 | Logger.log(editors); 49 | 50 | } 51 | 52 | function sel4() { 53 | const id = '1U85PLCGjVZCOUlGW9xX1h9HBcdH6QqTb'; 54 | const main = DriveApp.getFolderById(id); 55 | const files = main.getFiles(); 56 | while (files.hasNext()) { 57 | const file = files.next(); 58 | Logger.log(file.getId()); 59 | } 60 | } 61 | 62 | function sel3() { 63 | const id = '1U85PLCGjVZCOUlGW9xX1h9HBcdH6QqTb'; 64 | const main = DriveApp.getFolderById(id); 65 | const files = main.getFiles(); 66 | let counter = 1; 67 | while (files.hasNext()) { 68 | const file = files.next(); 69 | file.addViewer('gappscourses+5@gmail.com'); 70 | file.setName(`New ${counter}.html`); 71 | Logger.log(file.getMimeType()); 72 | const html = `

Laurence Svekis

${counter}
`; 73 | file.setContent(html); 74 | counter++; 75 | } 76 | } 77 | 78 | function sel2() { 79 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 80 | const main = DriveApp.getFolderById(id); 81 | const moveFolder = main.createFolder('Files'); 82 | const files = main.getFiles(); 83 | let counter = 1; 84 | while (files.hasNext()) { 85 | const file = files.next(); 86 | const fileName = file.getName(); 87 | const newNamer = `${counter}-${fileName}`; 88 | Logger.log(newNamer); 89 | file.makeCopy(newNamer, moveFolder); 90 | file.moveTo(moveFolder); 91 | counter++; 92 | } 93 | } 94 | 95 | function sel1() { 96 | const id = '1XI1d1VGFGICMJMTXAzyAbqpVfO2fLK5K'; 97 | const main = DriveApp.getFolderById(id); 98 | //const files = main.getFilesByName('File'); 99 | const files = main.getFiles(); 100 | Logger.log(files); 101 | while (files.hasNext()) { 102 | const file = files.next(); 103 | const fileName = file.getName(); 104 | if (fileName.includes('File')) { 105 | file.setStarred(true); 106 | } else { 107 | file.setTrashed(true); 108 | } 109 | Logger.log(file); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /APPS SCRIPT/Form AutoResponse Trigger Send PDF email: -------------------------------------------------------------------------------- 1 | function makeTrigger() { 2 | const sheet = SpreadsheetApp.getActive(); 3 | ScriptApp.newTrigger('adder') 4 | .forSpreadsheet(sheet) 5 | .onFormSubmit() 6 | .create(); 7 | } 8 | 9 | function adder(user){ 10 | const id = '14MXkJF5AykU9ND-z4strmly5zN_ant403-6YA6br0PY'; 11 | const ss = SpreadsheetApp.openById(id); 12 | const sheet = ss.getSheetByName('log'); 13 | const userinfo = { 14 | first : user.namedValues["First"][0], 15 | email : user.namedValues["Email Address"][0], 16 | last : user.namedValues["Last"][0], 17 | row : user.range.rowStart 18 | } 19 | const json = JSON.stringify(userinfo); 20 | const arr = Object.values(userinfo); 21 | arr.push(json); 22 | sheet.appendRow(arr); 23 | sender(userinfo); 24 | } 25 | 26 | function test1(){ 27 | const user = {"authMode":"FULL","namedValues":{"Email Address":["gappscourses@gmail.com"],"Last":["Svekis"],"Timestamp":["1/1/2022"],"First":["Laurence"]},"range":{"columnEnd":4,"columnStart":1,"rowEnd":2,"rowStart":2},"source":{},"triggerUid":"7667511207665245324","values":["1/1/2022","gappscourses@gmail.com","Laurence","Svekis"]} 28 | const userinfo = { 29 | first : user.namedValues["First"][0], 30 | email : user.namedValues["Email Address"][0], 31 | last : user.namedValues["Last"][0], 32 | row : user.range.rowStart 33 | } 34 | Logger.log(userinfo); 35 | sender(userinfo); 36 | } 37 | 38 | function sender(user){ 39 | let html = `

Hi ${user.first} ${user.last}

`; 40 | html += '
Thank you for submitting your form
' 41 | html += ''; 42 | for(key in user){ 43 | const val = user[key]; 44 | html += ``; 45 | } 46 | html += '
${val}
'; 47 | html += '
Have a nice day, Laurence
'; 48 | const blob = Utilities.newBlob(html,MimeType.HTML); 49 | blob.setName(`PDF for ${user.first}.pdf`); 50 | MailApp.sendEmail({ 51 | recipient:user.email, 52 | subject:'Form submitted', 53 | htmlBody:html, 54 | cc : 'gappscourses@gmail.com', 55 | attachments:[blob.getAs(MimeType.PDF)] 56 | }); 57 | } 58 | -------------------------------------------------------------------------------- /APPS SCRIPT/Form Service Make Forms: -------------------------------------------------------------------------------- 1 | function makeQuiz(){ 2 | const nameForm = 'Quiz 3'; 3 | const form = FormApp.create(nameForm); 4 | form.setIsQuiz(true); 5 | form.setTitle(nameForm); 6 | const que1 = form.addCheckboxItem(); 7 | que1.setTitle('What is your fav app?'); 8 | que1.setPoints(10); 9 | que1.setChoices([ 10 | que1.createChoice('Docs',true), 11 | que1.createChoice('Sheets',true), 12 | que1.createChoice('Slides',false), 13 | que1.createChoice('Drive',false) 14 | ]) 15 | const cor = FormApp.createFeedback().setText('Your are correct Docs :)').build(); 16 | const wro = FormApp.createFeedback().setText('Wrong').build(); 17 | que1.setFeedbackForCorrect(cor); 18 | que1.setFeedbackForIncorrect(wro); 19 | 20 | const que2 = form.addTextItem(); 21 | que2.setTitle('5 + 10?'); 22 | que2.setPoints(5); 23 | const val = FormApp.createTextValidation().requireNumberBetween(1,100).build(); 24 | //.requireNumberEqualTo(15).build(); 25 | que2.setValidation(val); 26 | Logger.log(form.getPublishedUrl()); 27 | } 28 | 29 | function updaterForm1(){ 30 | const id = '1bo5jc4APUEwAs_222aswIfPDcvU7ZEgjcuhDcpqXOiU'; 31 | const form = FormApp.openById(id); 32 | const que3 = form.addMultipleChoiceItem(); 33 | que3.setTitle('What app do you prefer?'); 34 | que3.setChoiceValues(['Docs','Sheets','Slides']); 35 | //que3.showOtherOption(); 36 | const que4 = form.addCheckboxItem(); 37 | que4.setTitle('Are you enjoying this lesson?'); 38 | que4.setChoices([ 39 | que4.createChoice('Yes',true), 40 | que4.createChoice('No',false), 41 | que4.createChoice('Maybe',false) 42 | ]) 43 | form.addPageBreakItem().setTitle('Page 2'); 44 | const que5 = form.addListItem(); 45 | que5.setTitle('Do you like?') 46 | .setChoices([ 47 | que5.createChoice('Docs'), 48 | que5.createChoice('Sheets') 49 | ]) 50 | } 51 | 52 | 53 | 54 | 55 | function updaterForm(){ 56 | const id = '1bo5jc4APUEwAs_222aswIfPDcvU7ZEgjcuhDcpqXOiU'; 57 | const form = FormApp.openById(id); 58 | const que2 = form.addCheckboxItem(); 59 | que2.setTitle('What is your favorite Google App?'); 60 | que2.setChoices([ 61 | que2.createChoice('Docs'), 62 | que2.createChoice('Sheets'), 63 | que2.createChoice('Slides'), 64 | que2.createChoice('Forms') 65 | ]) 66 | } 67 | 68 | function makeaForm() { 69 | const nameForm = 'my Form 2'; 70 | const form = FormApp.create(nameForm ); 71 | const que1 = form.addTextItem(); 72 | que1.isRequired(); 73 | que1.setTitle('Your first Name') 74 | Logger.log('URL'+form.getPublishedUrl()); 75 | Logger.log('ID '+form.getId()); 76 | const email = Session.getActiveUser().getEmail(); 77 | Logger.log(email); 78 | const url = form.getPublishedUrl(); 79 | const id = form.getId(); 80 | let html = `

New Form ${nameForm}

`; 81 | html += `
Your form is at ${url}
`; 82 | html += `
Your form id is ${id}
`; 83 | MailApp.sendEmail({ 84 | to: email, 85 | subject : 'New form ' + nameForm, 86 | htmlBody : html 87 | }); 88 | } 89 | -------------------------------------------------------------------------------- /APPS SCRIPT/Gmail Service GmailApp Class: -------------------------------------------------------------------------------- 1 | function emails6() { 2 | const id = '17e59d8de80a7e6c'; 3 | const thread = GmailApp.getThreadById(id); 4 | //Logger.log(thread); 5 | const messages = thread.getMessages(); 6 | const folder = DriveApp.createFolder('Attachments'); 7 | messages.forEach(message => { 8 | const att = message.getAttachments(); 9 | //Logger.log(att); 10 | att.forEach(attached => { 11 | Logger.log(attached); 12 | const blob = attached.copyBlob(); 13 | const file = folder.createFile(blob); 14 | }) 15 | }) 16 | } 17 | 18 | function emails5() { 19 | const lName = 'Aa New Label'; 20 | const label = GmailApp.getUserLabelByName(lName); 21 | const threads = label.getThreads(); 22 | threads.forEach(thread => { 23 | Logger.log(thread.getId()); 24 | }) 25 | } 26 | 27 | function labelAdd() { 28 | const label = GmailApp.createLabel('Aa New Label'); 29 | Logger.log(label); 30 | } 31 | 32 | function emails4() { 33 | const id = '17e59d8de80a7e6c'; 34 | const message = GmailApp.getMessageById(id); 35 | const thread = message.getThread(); 36 | const lName = 'Aa New Label'; 37 | const label = GmailApp.getUserLabelByName(lName); 38 | const labels = GmailApp.getUserLabels(); 39 | //Logger.log(labels); 40 | labels.forEach(lab => { 41 | //Logger.log(lab.getName()); 42 | }) 43 | Logger.log(label); 44 | label.addToThread(thread); 45 | //Logger.log(thread.isInTrash()); 46 | thread.moveToInbox(); 47 | //thread. 48 | 49 | } 50 | 51 | function emails3() { 52 | const id = '17e59d8de80a7e6c'; 53 | const message = GmailApp.getMessageById(id); 54 | const thread = message.getThread(); 55 | Logger.log(thread.getMessageCount()); 56 | thread.getMessages().forEach(mes => { 57 | Logger.log(mes.getSubject()); 58 | //mes.moveToTrash(); 59 | Logger.log(mes.isInTrash()); 60 | }) 61 | 62 | } 63 | 64 | 65 | 66 | 67 | 68 | function emails2() { 69 | const id = '17e59d8de80a7e6c'; 70 | const message = GmailApp.getMessageById(id); 71 | Logger.log(message); 72 | message.forward('gappscourses+25@gmail.com'); 73 | let html = `
Subject : ${message.getSubject()}
`; 74 | html += `
Plain Body : ${message.getPlainBody()}
`; 75 | //html += `
Form: ${message.getFrom()}
`; 76 | html += `
ID: ${message.getId()}
`; 77 | //html += `
Raw : ${message.getRawContent()}
`; 78 | html += `
HTML Body : ${message.getBody()}
`; 79 | Logger.log(html); 80 | message.reply(html); 81 | } 82 | 83 | function emails1() { 84 | const threads = GmailApp.getInboxThreads(); 85 | Logger.log(GmailApp.getInboxUnreadCount()); 86 | Logger.log(threads); 87 | threads.forEach((thread) => { 88 | Logger.log(thread.getMessageCount()); 89 | const messages = thread.getMessages(); 90 | messages.forEach(message => { 91 | Logger.log(message.getSubject()); 92 | Logger.log(message.getId()); 93 | }) 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /APPS SCRIPT/PDF maker: -------------------------------------------------------------------------------- 1 | function myData(){ 2 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 | const sheet = ss.getSheetByName('data'); 4 | const rows = sheet.getDataRange().getValues(); 5 | const data = rows.slice(1); 6 | data.forEach((row,ind)=>{ 7 | const val = makerDoc(row,ind); 8 | const updateRange = sheet.getRange(val.row,5); 9 | updateRange.setValue(val.message); 10 | 11 | }) 12 | //Logger.log(data); 13 | } 14 | 15 | function makerDoc(data,ind){ 16 | //Logger.log(data); 17 | const rowVal = ind + 2; 18 | let message = `${data[0]} ${data[1]}`; 19 | const docName = `${data[0]} ${data[1]} ${rowVal}`; 20 | const doc = DocumentApp.create(docName); 21 | const bodyData = `${docName} Hello and Welcome. your id is ${data[2]}`; 22 | const body = doc.getBody(); 23 | body.appendParagraph(bodyData); 24 | const url = doc.getUrl(); 25 | message += ` Your doc is located at ${url}`; 26 | body.appendParagraph(message); 27 | const email = data[3]; 28 | const subject = `${docName} created`; 29 | const emailBody = `Your doc is created at ${url}`; 30 | MailApp.sendEmail(email,subject,emailBody); 31 | //Logger.log(docName); 32 | return {row:rowVal,message:message}; 33 | } 34 | -------------------------------------------------------------------------------- /APPS SCRIPT/PDF sender: -------------------------------------------------------------------------------- 1 | function pdfMaker() { 2 | const id = '1yXiEb6EDJlRyEAskPqiiyNh52pCcVLOJ2t9dzJKvneU'; 3 | const ss = SpreadsheetApp.openById(id); 4 | const sheet = ss.getSheetByName('data'); 5 | const data = sheet.getDataRange().getValues().slice(1); 6 | data.forEach((row,ind)=>{ 7 | let html = `

${row[0]} ${row[1]}

`; 8 | html += `
Welcome your id is ${row[2]}
`; 9 | html += `
Thank You
`; 10 | const blob = Utilities.newBlob(html,MimeType.HTML); 11 | blob.setName(`${row[0]} ${row[1]}.pdf`); 12 | const email = row[3]; 13 | const subject = `New PDF ${row[0]} ${row[1]}`; 14 | MailApp.sendEmail({ 15 | to:email, 16 | subject:subject, 17 | htmlBody:html, 18 | attachments:[blob.getAs(MimeType.PDF)], 19 | }); 20 | sheet.getRange(ind+2,5).setValue('sent'); 21 | Logger.log(blob); 22 | }) 23 | } 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /APPS SCRIPT/Sheets range updater: -------------------------------------------------------------------------------- 1 | function sheet4(){ 2 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 3 | const ss = SpreadsheetApp.openById(id); 4 | const sheet = ss.getSheetByName('test2'); 5 | const range = sheet.getDataRange(); 6 | range.randomize(); 7 | range.removeDuplicates(); 8 | range.merge(); 9 | } 10 | 11 | function sheet3() { 12 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 13 | const ss = SpreadsheetApp.openById(id); 14 | const sheet = ss.getSheetByName('test1'); 15 | const rows = sheet.getLastRow()-1; 16 | const range2 = sheet.getRange(2,5,rows,1); 17 | range2.setBackground(ranBack()); 18 | range2.setFontColor(ranBack()); 19 | const range3 = sheet.getRange(2,1,rows,4); 20 | Logger.log(range3.getValues()); 21 | range3.randomize(); 22 | 23 | } 24 | 25 | function ranBack(){ 26 | const val = `#${Math.random().toString(16).substring(2,8)}`; 27 | Logger.log(val); 28 | return val; 29 | } 30 | 31 | function sheet2() { 32 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 33 | const ss = SpreadsheetApp.openById(id); 34 | const sheet = ss.getSheetByName('test1'); 35 | const rows = sheet.getLastRow()-1; 36 | const range2 = sheet.getRange(2,5,rows,1); 37 | const sums = []; 38 | for(let i=0;i{ 62 | //Logger.log(row); 63 | }) 64 | //Logger.log(allData.getValues()[0]); 65 | const range2 = sheet.getRange(2,5,sheet.getLastRow()-1,1); 66 | Logger.log(sheet.getLastRow()); 67 | Logger.log(sheet.getLastColumn()); 68 | range2.setBorder(true,true,false,false,false,false,'red',SpreadsheetApp.BorderStyle.SOLID_THICK); 69 | 70 | 71 | } 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | function updater1() { 115 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 116 | const ss = SpreadsheetApp.openById(id); 117 | Logger.log(ss.getUrl()); 118 | const testName = 'test1'; 119 | let sheet = ss.getSheetByName(testName); 120 | Logger.log(sheet); 121 | if (!sheet) { 122 | sheet = ss.insertSheet(); 123 | sheet.setName(testName); 124 | } 125 | ss.setActiveSheet(sheet); 126 | let first = ss.getSheets()[0]; 127 | if (first.getName() != testName) { 128 | ss.moveActiveSheet(0); 129 | first = ss.getSheets()[0]; 130 | } 131 | Logger.log(first.getName()); 132 | const headings1 = ['first', 'second', 'third', 'fourth']; 133 | const headings = headings1.map(name => { 134 | let newValue = name.toLowerCase(); 135 | let firstLetter = newValue.charAt(0).toUpperCase(); 136 | let letters = newValue.slice(1); 137 | return firstLetter + letters; 138 | }); 139 | const headerRange = sheet.getRange(1, 1, 1, headings.length); 140 | const headingValues = headerRange.getValues()[0]; 141 | if (!arrStringChecker(headings, headingValues)) { 142 | headerRange.setValues([headings]); 143 | } 144 | 145 | for (let i = 0; i < 5; i++) { 146 | sheet.appendRow([i, rNum(), rNum(), rNum()]); 147 | const ran1 = sheet.insertRowsBefore(2, 1).getRange(2, 1, 1, headings.length); 148 | const newData = adderValues(headings.length); 149 | ran1.setValues([newData]); 150 | } 151 | 152 | const tempArr = []; 153 | const rows = 3; 154 | for (let i = 0; i < rows; i++) { 155 | tempArr.push(adderValues(headings.length)); 156 | } 157 | Logger.log(tempArr); 158 | sheet.insertRowsBefore(2, rows).getRange(2, 1, rows, headings.length).setValues(tempArr); 159 | 160 | 161 | if (arrStringChecker(headings, headingValues)) { 162 | Logger.log('match'); 163 | //Logger.log(headings); 164 | //Logger.log(headingValues); 165 | } else { 166 | Logger.log('NO match'); 167 | //Logger.log(headings); 168 | //Logger.log(headingValues); 169 | headerRange.setValues([headings]); 170 | } 171 | 172 | 173 | } 174 | 175 | 176 | function adderValues(num) { 177 | const temp = []; 178 | for (let i = 0; i < num; i++) { 179 | temp.push(rNum()); 180 | } 181 | return temp; 182 | } 183 | 184 | 185 | 186 | function rNum() { 187 | let min = 1; 188 | let max = 1000; 189 | return Math.floor(Math.random() * (max - min) + min); 190 | } 191 | 192 | 193 | function arrStringChecker(a1, a2) { 194 | return JSON.stringify(a1) === JSON.stringify(a2); 195 | } 196 | 197 | 198 | 199 | 200 | 201 | 202 | function maker() { 203 | const ss = SpreadsheetApp.create('test2'); 204 | Logger.log(ss.getId()); 205 | } 206 | 207 | function updater5() { 208 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 209 | const ss = SpreadsheetApp.openById(id); 210 | const sheet = ss.getSheetByName('test1'); 211 | const rules = sheet.getConditionalFormatRules(); 212 | const range1 = sheet.getRange('A2:D9'); 213 | const con1 = SpreadsheetApp.newConditionalFormatRule() 214 | .whenNumberBetween(0, 500) 215 | .setBackground('#0000FF') 216 | .setRanges([range1]) 217 | .build(); 218 | rules[0] = con1; 219 | sheet.setConditionalFormatRules(rules); 220 | } 221 | 222 | function updater4() { 223 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 224 | const ss = SpreadsheetApp.openById(id); 225 | const sheet = ss.getSheetByName('test1'); 226 | sheet.clearConditionalFormatRules(); 227 | const rules = sheet.getConditionalFormatRules(); 228 | Logger.log(rules); 229 | const range1 = sheet.getRange('A2:C9'); 230 | const con1 = SpreadsheetApp.newConditionalFormatRule() 231 | .whenNumberBetween(0, 500) 232 | .setBackground('#00FF00') 233 | .setRanges([range1]) 234 | .build(); 235 | rules.push(con1); 236 | //sheet.setConditionalFormatRules(rules); 237 | } 238 | 239 | function updater3() { 240 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 241 | const ss = SpreadsheetApp.openById(id); 242 | const sheet = ss.getSheetByName('test1'); 243 | const rules = sheet.getConditionalFormatRules(); 244 | rules.forEach(rule => { 245 | Logger.log(rule.getRanges()); 246 | /* 247 | const ranges = rule.getRanges(); 248 | for (let i = 0; i < ranges.length; i++) { 249 | Logger.log(ranges[i].getA1Notation()); 250 | ranges[i].setFontColor('#00ff00'); 251 | } 252 | */ 253 | const boo = rule.getBooleanCondition(); 254 | Logger.log(rule.getBooleanCondition().getBackground()); 255 | Logger.log(rule.getGradientCondition()); 256 | }) 257 | Logger.log(rules); 258 | } 259 | 260 | 261 | 262 | 263 | function updater2() { 264 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 265 | const ss = SpreadsheetApp.openById(id); 266 | const sheet = ss.getSheetByName('test1'); 267 | Logger.log(sheet.getName()); 268 | const range1 = sheet.getRange('A2:C9'); 269 | Logger.log(range1.getValues()); 270 | const con1 = SpreadsheetApp.newConditionalFormatRule() 271 | .whenNumberBetween(0, 500) 272 | .setBackground('#dddddd') 273 | .setRanges([range1]) 274 | .build(); 275 | const rules = sheet.getConditionalFormatRules(); 276 | Logger.log(rules); 277 | rules.push(con1); 278 | sheet.setConditionalFormatRules(rules); 279 | 280 | } 281 | 282 | 283 | -------------------------------------------------------------------------------- /APPS SCRIPT/SpreadsheetApp Code Examples: -------------------------------------------------------------------------------- 1 | function cleaner(){ 2 | const id = '1vliRFwXoINpk1Hg8x6Zb7Rgm2MI4yg9ZzKhE3Mp3FMA'; 3 | const ss = SpreadsheetApp.openById(id); 4 | const sheets = ss.getSheets(); 5 | sheets.forEach((sheet)=>{ 6 | const data = sheet.getDataRange().getValues(); 7 | if(data.length <= 1){ 8 | Logger.log(sheet.getSheetName()); 9 | ss.deleteSheet(sheet); 10 | }; 11 | }) 12 | } 13 | 14 | function adder2(){ 15 | const id = '1vliRFwXoINpk1Hg8x6Zb7Rgm2MI4yg9ZzKhE3Mp3FMA'; 16 | const ss = SpreadsheetApp.openById(id); 17 | const sheet = ss.getSheetByName('S7'); 18 | const arr = ['Coding','Car','Hello','World','Website']; 19 | arr.forEach((val,ind)=>{ 20 | const sp = LanguageApp.translate(val,'en','es'); 21 | const lv = LanguageApp.translate(val,'en','lv'); 22 | const ko = LanguageApp.translate(val,'en','ko'); 23 | sheet.appendRow([ind+1,val,sp,lv,ko]); 24 | }) 25 | } 26 | 27 | function adder1(){ 28 | const id = '1vliRFwXoINpk1Hg8x6Zb7Rgm2MI4yg9ZzKhE3Mp3FMA'; 29 | const ss = SpreadsheetApp.openById(id); 30 | const sheet = ss.getSheets()[0]; 31 | const arr = ['Hello','World','Website']; 32 | sheet.appendRow(arr); 33 | const range1 = sheet.getRange(1,5); 34 | range1.setValue('Laurence'); 35 | const range2 = sheet.getRange(2,1,2); 36 | range2.setValues([[1],[2]]); 37 | const range3 = sheet.getRange(4,2,2,3); 38 | range3.setValues([[1,2,3],[4,5,6]]); 39 | const range4 = sheet.getRange('E3'); 40 | range4.setValue('Svekis'); 41 | const range5 = sheet.getRange('S6!A1:C3'); 42 | range5.setValues([[1,2,3],[4,5,6],[7,8,9]]); 43 | } 44 | 45 | function upSheet1(){ 46 | const id = '1vliRFwXoINpk1Hg8x6Zb7Rgm2MI4yg9ZzKhE3Mp3FMA'; 47 | const ss = SpreadsheetApp.openById(id); 48 | for(let i=0;i<10;i++){ 49 | const sheetNamer = `S${i+1}`; 50 | let newName = ss.getSheetByName(sheetNamer); 51 | if(!newName){ 52 | newName = ss.insertSheet(); 53 | newName.setName(sheetNamer); 54 | } 55 | } 56 | const sheets = ss.getSheets(); 57 | Logger.log(sheets); 58 | sheets.forEach((sheet,index)=>{ 59 | Logger.log(sheet.getSheetName()); 60 | }) 61 | } 62 | 63 | function makeSheet() { 64 | const ss = SpreadsheetApp.create('NewSheets',30,7); 65 | Logger.log(ss.getUrl()); 66 | const email = Session.getActiveUser().getEmail(); 67 | const url = ss.getUrl(); 68 | const body = `New Sheet at ${url}`; 69 | MailApp.sendEmail(email,'Sheet',body); 70 | } 71 | -------------------------------------------------------------------------------- /APPS SCRIPT/UI menu maker: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | const ui = SpreadsheetApp.getUi(); 3 | ui.createMenu('Adv') 4 | .addItem('Test 1','test1') 5 | .addItem('Test 2','test2') 6 | .addItem('Test 3','test3') 7 | .addToUi(); 8 | } 9 | 10 | function test1(){ 11 | const ss = SpreadsheetApp.getActiveSheet(); 12 | const data = ss.getActiveRange().getValues(); 13 | let mes = ''; 14 | data.forEach(ele =>{ 15 | ele.sort(); 16 | let output = ele.join('|'); 17 | mes += output + '\n'; 18 | }) 19 | //Logger.log(mes); 20 | outputMessage(mes); 21 | } 22 | function test2(){ 23 | const ss = SpreadsheetApp.getActiveSheet(); 24 | const data = ss.getActiveRange().getValues(); 25 | data.forEach((row,ind) =>{ 26 | const checker = row.indexOf('Laurence'); 27 | if(checker != -1 ){ 28 | Logger.log(checker+1); 29 | Logger.log(ind+1); 30 | const range = ss.getActiveRange(); 31 | const x = range.getRow() + ind; 32 | const y = range.getColumn() + checker; 33 | const cell = ss.getRange(x,y); 34 | cell.setBackground('yellow'); 35 | //outputMessage(`${x} x ${y}`); 36 | } 37 | }) 38 | } 39 | function test3(){ 40 | const ss = SpreadsheetApp.getActiveSheet(); 41 | const range = ss.getActiveRange(); 42 | const data = range.getValues(); 43 | const holder = []; 44 | let counter = 0; 45 | data.forEach((row)=>{ 46 | const upArr = row.map((val)=>{ 47 | const dotInd = val.toString().indexOf('.'); 48 | //Logger.log(dotInd); 49 | let output = val.toString().trim(); 50 | if(dotInd != -1){ 51 | output = val.toString().slice(dotInd+1).trim(); 52 | } 53 | counter++; 54 | return `${counter}. ${output.toString()}`; 55 | }) 56 | holder.push(upArr); 57 | }) 58 | Logger.log(holder); 59 | range.setValues(holder); 60 | range.clearFormat(); 61 | 62 | } 63 | 64 | function outputMessage(val){ 65 | SpreadsheetApp.getUi().alert(val); 66 | } 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /APPS SCRIPT/Update Spreadsheet sheet prepend rows: -------------------------------------------------------------------------------- 1 | function updater1(){ 2 | const id = '12ShJG5pi-CFGLB6Aw8PXzemqIFKuAcQmHwTg5dREt8s'; 3 | const ss = SpreadsheetApp.openById(id); 4 | Logger.log(ss.getUrl()); 5 | const testName = 'test1'; 6 | let sheet = ss.getSheetByName(testName); 7 | Logger.log(sheet); 8 | if(!sheet){ 9 | sheet = ss.insertSheet(); 10 | sheet.setName(testName); 11 | } 12 | ss.setActiveSheet(sheet); 13 | let first = ss.getSheets()[0]; 14 | if(first.getName() != testName){ 15 | ss.moveActiveSheet(0); 16 | first = ss.getSheets()[0]; 17 | } 18 | Logger.log(first.getName()); 19 | const headings1 = ['first','second','third','fourth']; 20 | const headings = headings1.map(name => { 21 | let newValue = name.toLowerCase(); 22 | let firstLetter = newValue.charAt(0).toUpperCase(); 23 | let letters = newValue.slice(1); 24 | return firstLetter + letters; 25 | }); 26 | const headerRange = sheet.getRange(1,1,1,headings.length); 27 | const headingValues = headerRange.getValues()[0]; 28 | if(!arrStringChecker(headings,headingValues)){ 29 | headerRange.setValues([headings]); 30 | } 31 | 32 | for(let i=0;i<5;i++){ 33 | //sheet.appendRow([i,rNum(),rNum(),rNum()]); 34 | const ran1 = sheet.insertRowsBefore(2,1).getRange(2,1,1,headings.length); 35 | const newData = adderValues(headings.length); 36 | ran1.setValues([newData]); 37 | } 38 | 39 | const tempArr = []; 40 | const rows = 3; 41 | for(let i=0;iHello World 3`; 3 | const eData = JSON.stringify(e); 4 | if('id' in e.parameter){ 5 | let val = e.parameter['id']; 6 | let data = buildHTML(val); 7 | html += `
Found Row #${e.parameter['id']}
`; 8 | html += `

${data[2]}

`; 9 | } 10 | html += `
${eData}
`; 11 | return HtmlService.createHtmlOutput(html); 12 | } 13 | 14 | function test1(){ 15 | const val = buildHTML(1); 16 | Logger.log(val[2]); 17 | } 18 | 19 | 20 | 21 | function buildHTML(row){ 22 | row = row-1 || 0; 23 | const id = '1aSBcG-tw-zZzkelCGXIm465ky4ZcId9mgOMyXNk0Pzg'; 24 | const sheet = SpreadsheetApp.openById(id).getSheetByName('Sheet2'); 25 | const data = sheet.getDataRange().getValues(); 26 | return data[row]; 27 | } 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /APPS SCRIPT/add Triggers automation: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | const ui = SpreadsheetApp.getUi(); 3 | ui.createMenu('Adv') 4 | .addItem('test1','test1') 5 | .addItem('test2','test2') 6 | .addToUi(); 7 | logMe(); 8 | } 9 | 10 | function createTimers(){ 11 | ScriptApp.newTrigger('logMe') 12 | .timeBased() 13 | .everyHours(4) 14 | .create(); 15 | } 16 | 17 | function logMe(){ 18 | const id = '13UFJVM0ACo9mTDjNJnt_HBAJRcNtTYPwW-Wc0dOqU_s'; 19 | const ss = SpreadsheetApp.openById(id).getSheetByName('log'); 20 | const ran = Math.floor(Math.random()*1000); 21 | ss.appendRow(['test',ran]); 22 | } 23 | 24 | 25 | function onEdit(e){ 26 | //output(JSON.stringify(e)); 27 | } 28 | 29 | 30 | 31 | 32 | function test1(){ 33 | output('test1'); 34 | } 35 | 36 | function test2(){ 37 | output('test2'); 38 | } 39 | 40 | function output(val){ 41 | SpreadsheetApp.getUi().alert(val); 42 | } 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /APPS SCRIPT/client side web app host service data: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

12 | 13 | 14 | 15 |
16 | 36 | 37 | 38 | 39 | function doGet() { 40 | const myObj = { 41 | first : 'Laurence', 42 | last : 'Svekis', 43 | id : 100 44 | } 45 | const html = HtmlService.createTemplateFromFile('index'); 46 | html.data = { 47 | status : 'ready', 48 | data : myObj 49 | } 50 | return html.evaluate(); 51 | } 52 | 53 | function testFun(user){ 54 | const arr = [user.first,user.last]; 55 | const row = addtoSheet(arr); 56 | return row; 57 | } 58 | 59 | function addtoSheet(data){ 60 | const id = '1aSBcG-tw-zZzkelCGXIm465ky4ZcId9mgOMyXNk0Pzg'; 61 | const sheet = SpreadsheetApp.openById(id).getSheetByName('Sheet2'); 62 | sheet.appendRow(data); 63 | return sheet.getLastRow(); 64 | } 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /APPS SCRIPT/create an endpoint for web apps: -------------------------------------------------------------------------------- 1 | index.html 2 | 3 | 4 | 5 | JavaScript Course 6 | 7 | 8 | 9 | 10 |
Output
11 | 12 | 13 | 14 | 15 | gas.js 16 | const url = 'https://script.google.com/macros/s/AKfycbxBHUXc5rPxG2TPYNSFFGBTEaoz5WDj0e7WiHhjeKQ_PO3RtI94X5t3IN8IBvrrEFgktw/exec'; 17 | const output = document.querySelector('.output'); 18 | const btn = document.querySelector('button'); 19 | const myInput = document.querySelector('input'); 20 | const ul = document.createElement('ul'); 21 | output.innerHTML = ''; 22 | output.append(ul); 23 | btn.addEventListener('click',(e)=>{ 24 | const formData = new FormData(); 25 | formData.append('row',myInput.value); 26 | fetch(url,{ 27 | method:'POST', 28 | body: formData 29 | }) 30 | .then(res => res.json()) 31 | .then(data => { 32 | console.log(data[1]); 33 | addOutput(data[1]); 34 | }) 35 | }) 36 | function addOutput(row){ 37 | const li = document.createElement('li'); 38 | ul.append(li); 39 | li.innerHTML = `
${row.first} ${row.last} ${row.fullName}
`; 40 | } 41 | 42 | btn.addEventListener('click',(e)=>{ 43 | fetch(url) 44 | .then(res => res.json()) 45 | .then(data => { 46 | addData(data); 47 | }) 48 | }) 49 | 50 | function addData(data){ 51 | output.innerHTML = ''; 52 | data.forEach((row) =>{ 53 | output.innerHTML += `
${row.first} ${row.last} ${row.fullName}
`; 54 | }) 55 | } 56 | 57 | *** APPs Script *** web app deployed 58 | function doPost(e) { 59 | const id = '1aSBcG-tw-zZzkelCGXIm465ky4ZcId9mgOMyXNk0Pzg'; 60 | const sheet = SpreadsheetApp.openById(id).getSheetByName('Sheet2'); 61 | const data = sheet.getDataRange().getValues(); 62 | const holder = [JSON.stringify(e)]; 63 | if('row' in e.parameter){ 64 | let val = e.parameter['row']; 65 | val--; 66 | let row = data[val]; 67 | const temp = { 68 | first : row[0], 69 | last : row[1], 70 | fullName : row[2] 71 | } 72 | holder.push(temp); 73 | } 74 | return ContentService.createTextOutput(JSON.stringify(holder)).setMimeType(ContentService.MimeType.JSON); 75 | } 76 | 77 | function doGet(e) { 78 | const id = '1aSBcG-tw-zZzkelCGXIm465ky4ZcId9mgOMyXNk0Pzg'; 79 | const sheet = SpreadsheetApp.openById(id).getSheetByName('Sheet2'); 80 | const data = sheet.getDataRange().getValues(); 81 | const holder = []; 82 | data.forEach((row)=>{ 83 | const temp = { 84 | first : row[0], 85 | last : row[1], 86 | fullName : row[2] 87 | } 88 | holder.push(temp); 89 | }) 90 | Logger.log(holder); 91 | return ContentService.createTextOutput(JSON.stringify(holder)).setMimeType(ContentService.MimeType.JSON); 92 | } 93 | -------------------------------------------------------------------------------- /APPS SCRIPT/custom Functions: -------------------------------------------------------------------------------- 1 | function MYCUSTOM(val) { 2 | const rep = val * val + 10; 3 | return rep; 4 | } 5 | 6 | function MYDOUBLER(val) { 7 | return val * 2; 8 | } 9 | 10 | function MYTEST(val) { 11 | return val; 12 | } 13 | 14 | function FULLNAME(first,last){ 15 | const val = `${first} ${last}` 16 | return `${val} ${val.length}`; 17 | } 18 | 19 | function SALESTAX(val) { 20 | return val * 0.15; 21 | } 22 | 23 | function LATLONGFIND(val){ 24 | const geoCoder = Maps.newGeocoder(); 25 | try { 26 | const loc = geoCoder.geocode(val); 27 | if(loc.status){ 28 | const locat = loc.results[0].geometry.location; 29 | return `lat:${locat.lat} long:${locat.lng}`; 30 | }else{ 31 | return 'Not Found';} 32 | } catch(error) { 33 | return 'Not Found'; 34 | } 35 | } 36 | 37 | function test(){ 38 | const geoCoder = Maps.newGeocoder(); 39 | const val = 'Toronto'; 40 | const loc = geoCoder.geocode(val); 41 | if(loc.status){ 42 | Logger.log(loc.results[0].geometry.location); 43 | const locat = loc.results[0].geometry.location; 44 | Logger.log(`lat:${locat.lat} long:${locat.lng}`); 45 | return `lat:${locat.lat} long:${locat.lng}`; 46 | }else{ 47 | return 'Not Found'; 48 | } 49 | 50 | } 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Apps Script Emailer/Apps Script Code: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | const ui = SpreadsheetApp.getUi(); 3 | ui.createMenu('send email').addItem('Approve', 'approver').addToUi() 4 | } 5 | 6 | function approver() { 7 | const ui = SpreadsheetApp.getUi(); 8 | const row = SpreadsheetApp.getActiveSheet().getActiveCell().getRow(); 9 | Logger.log(row); 10 | const data = SpreadsheetApp.getActiveSheet().getRange(row, 1, 1, 3).getValues()[0]; 11 | const user = { 12 | first: data[0] 13 | , last: data[1] 14 | , email: data[2] 15 | , row: row 16 | }; 17 | Logger.log(user); 18 | const res = ui.alert('Send to ' + user.first + '(' + user.email + ')?', ui.ButtonSet.YES_NO); 19 | if (res == ui.Button.YES) { 20 | sendUser(user); 21 | } 22 | Logger.log(res); 23 | } 24 | 25 | function sendUser(user) { 26 | //let message = '

Hello World

'; 27 | const temp = HtmlService.createTemplateFromFile('temp'); 28 | temp.user = user; 29 | const message = temp.evaluate().getContent(); 30 | MailApp.sendEmail({ 31 | to: user.email 32 | , subject: 'Tester' 33 | , htmlBody: message 34 | }); 35 | SpreadsheetApp.getActiveSheet().getRange(user.row, 4).setValue('sent'); 36 | } 37 | -------------------------------------------------------------------------------- /Apps Script Emailer/temp HTML template for email: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Hi,

8 |
You have been approved
9 |
Congrats ....
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Apps Script WebApp Sheet as JSON AJAX get Sheet data with JavaScript: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sheet data 5 | 11 | 12 | 13 |
Hi
14 | 15 | 16 | 17 | 18 | const output = document.querySelector('.output'); 19 | const btn = document.createElement('button'); 20 | const output1 = document.createElement('div'); 21 | output.textContent = ''; 22 | output.append(btn); 23 | output.append(output1); 24 | btn.textContent = 'Load Sheet Data'; 25 | const url = 'https://script.google.com/macros/s/A****EB6dxHz9KKxB7luyM_RWHquPCXGskoQ/exec'; 26 | //output.textContent ='Hello World'; 27 | document.addEventListener('DOMContentLoaded',init); 28 | btn.addEventListener('click',init); 29 | function init(){ 30 | console.log('ready'); 31 | output1.innerHTML = 'Loading.... '; 32 | fetch(url) 33 | .then((res)=> {return res.json()}) 34 | .then((data)=>{ 35 | makeOutput(data); 36 | }) 37 | } 38 | 39 | function makeOutput(res){ 40 | console.log(res.status); 41 | output1.innerHTML = ''; 42 | res.data.forEach((row)=>{ 43 | console.log(row); 44 | const div = document.createElement('div'); 45 | output1.append(div); 46 | div.innerHTML = `${row.first} ${row.last} [${row.id}]`; 47 | div.classList.add('box'); 48 | if(row.status){ 49 | div.style.color = 'black'; 50 | }else{ 51 | div.style.color = 'red'; 52 | } 53 | }) 54 | } 55 | 56 | function outputData() { 57 | const id = '1zhez9FBfG****8Pspud_10h1A_TntCc'; 58 | const sheetName = 'data1'; 59 | const ss = SpreadsheetApp.openById(id); 60 | const sheet = ss.getSheetByName(sheetName); 61 | const range = sheet.getDataRange(); 62 | const data = range.getValues(); 63 | const headings = data[0].map((val)=>{ 64 | //Logger.log(val); 65 | return val.toString().toLowerCase(); 66 | }) 67 | const rows = data.slice(1); 68 | return (covObjects(rows,headings)); 69 | } 70 | 71 | function covObjects(rows,headings){ 72 | const temp = rows.map((row)=>{ 73 | const myObj = {}; 74 | headings.forEach((heading,index)=>{ 75 | myObj[heading] = row[index]; 76 | }) 77 | return myObj; 78 | }) 79 | return temp; 80 | } 81 | 82 | function doGet(e){ 83 | const output = JSON.stringify({ 84 | status:'success', 85 | data:outputData() 86 | }) 87 | return ContentService.createTextOutput(output).setMimeType(ContentService.MimeType.JSON); 88 | } 89 | 90 | 91 | 92 | /* 93 | function doGet(){ 94 | const html = HtmlService.createTemplateFromFile('data1'); 95 | html.myStr = '

Hello World 7

'; 96 | return html.evaluate(); 97 | } 98 | */ 99 | -------------------------------------------------------------------------------- /Between The BRackets Source: -------------------------------------------------------------------------------- 1 | const SHEETID = '1wZLJEsUkuuOj9m9Nih8DV65fm4'; 2 | const DOCID = '1RwP1-mdRC-woKH-tvqYomziT5bDG5T5U'; 3 | const FOLDERID = '1-PGzFd5yL9or1fHaV4'; 4 | 5 | function onOpen(){ 6 | SpreadsheetApp.getUi() 7 | .createMenu('Email Out') 8 | .addItem('Send Emails','sender') 9 | .addToUi(); 10 | } 11 | 12 | function sender() { 13 | const sheet = SpreadsheetApp.openById(SHEETID).getSheetByName('data'); 14 | const data = sheet.getDataRange().getValues(); 15 | 16 | const temp = DriveApp.getFileById(DOCID); 17 | const folder = DriveApp.getFolderById(FOLDERID); 18 | 19 | const rows = data.slice(1); 20 | rows.forEach((row,index)=>{ 21 | if(row[4] == ''){ 22 | const file = temp.makeCopy(folder); 23 | const doc = DocumentApp.openById(file.getId()); 24 | const body = doc.getBody(); 25 | data[0].forEach((heading,i)=>{ 26 | const header1 = heading.toUpperCase(); 27 | body.replaceText(`{${header1}}`,row[i]); 28 | }) 29 | doc.setName(row[0]+row[1]); 30 | const blob = doc.getAs(MimeType.PDF); 31 | doc.saveAndClose(); 32 | const pdf = folder.createFile(blob).setName(row[0]+row[1]+'.pdf'); 33 | const email = row[3]; 34 | const subject = row[0]+row[1]+'new file created'; 35 | const messageBody = `Hi, ${row[0]} Welcome we've created a PDF for you!`; 36 | MailApp.sendEmail({ 37 | to:email, 38 | subject:subject, 39 | htmlBody: messageBody, 40 | attachments: [blob.getAs(MimeType.PDF)] 41 | }); 42 | const tempo = sheet.getRange(index+2,5,1,1); 43 | tempo.setValue(new Date()); 44 | file.setTrashed(true); 45 | } 46 | }) 47 | 48 | } 49 | -------------------------------------------------------------------------------- /Client Side WebApp with Data: -------------------------------------------------------------------------------- 1 | function doGet(e) { 2 | const html = HtmlService.createTemplateFromFile('index'); 3 | html.dataQ = { 4 | arr : [1,2,3,4], 5 | val : 5 6 | } 7 | const output = html.evaluate(); 8 | return output; 9 | } 10 | 11 | 15 | 16 | 17 | 18 | 19 | 24 | 25 | 26 |

Hello World V2

27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ClientSide Form File Upload to Drive Folder: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 |
9 | 10 | 11 |
12 | 37 | 38 | 39 | 40 | function doGet(){ 41 | return HtmlService.createHtmlOutputFromFile('upload'); 42 | } 43 | 44 | function adderFile(data){ 45 | const myFile = Utilities.newBlob(Utilities.base64Decode(data.data),data.mimeType,data.fileName); 46 | const id = '1Yi2Sh6UZgFsM7gZ5-XxeOlFSL5PV78jT'; 47 | const sid = '1zhez9FBfGRjs8SRK58SjJ2BTu8Pspud_10h1A_TntCc'; 48 | const folder = DriveApp.getFolderById(id); 49 | const fileAdded = folder.createFile(myFile); 50 | const ss = SpreadsheetApp.openById(sid ).getSheetByName('log'); 51 | ss.appendRow([fileAdded.getUrl(),data.fileName,data.mimeType,fileAdded.getId()]); 52 | const rep = { 53 | 'url' : fileAdded.getUrl(), 54 | 'name' : data.fileName 55 | }; 56 | return rep; 57 | } 58 | 59 | -------------------------------------------------------------------------------- /Code Example Google Apps Script set Style of text with Code: -------------------------------------------------------------------------------- 1 | const hText = {}; 2 | hText[DocumentApp.Attribute.BACKGROUND_COLOR] = '#000000'; 3 | hText[DocumentApp.Attribute.BORDER_COLOR] = '#ffffff'; 4 | hText[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = 5 | DocumentApp.HorizontalAlignment.RIGHT; 6 | hText[DocumentApp.Attribute.FONT_FAMILY] = 'Calibri'; 7 | hText[DocumentApp.Attribute.FONT_SIZE] = 18; 8 | hText[DocumentApp.Attribute.BOLD] = true; 9 | 10 | function adder(){ 11 | const doc = DocumentApp.getActiveDocument(); 12 | const body = doc.getBody(); 13 | const par = body.appendParagraph('TEST Hello World'); 14 | par.setAttributes(hText); 15 | } 16 | 17 | function myDocTest() { 18 | const doc = DocumentApp.getActiveDocument().editAsText(); 19 | const doc1 = doc.insertText(50,'HELLO world\n'); 20 | doc1.setAttributes(20,40,hText); 21 | Logger.log(doc); 22 | } 23 | -------------------------------------------------------------------------------- /ContentService Examples: -------------------------------------------------------------------------------- 1 | function doGet(){ 2 | const id = '1zhez9FBfGRjs8SRK58SjJ2BTu8Pspud_10h1A_TntCc'; 3 | const data = SpreadsheetApp.openById(id).getSheetByName('data1').getDataRange().getValues(); 4 | Logger.log(data); 5 | return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON); 6 | } 7 | 8 | 9 | /* function doGet(){ 10 | //const url = 'https://randomuser.me/api/?results=10'; 11 | const url = 'https://basescripts.com/feed/?feed=json'; 12 | const data = UrlFetchApp.fetch(url).getContentText(); 13 | Logger.log(data); 14 | return ContentService.createTextOutput(data).setMimeType(ContentService.MimeType.JSON); 15 | } */ 16 | 17 | 18 | /* function doGet(e) { 19 | const val = { 20 | test: "hello", 21 | test1: "world", 22 | test3: 5 23 | } 24 | const myTxt = JSON.stringify(val); 25 | return ContentService.createTextOutput(myTxt).setMimeType(ContentService.MimeType.JSON); 26 | } */ 27 | 28 | 29 | /* function doGet(e) { 30 | const val = 'Hello World 2'; 31 | return ContentService.createTextOutput(val); 32 | } */ 33 | 34 | -------------------------------------------------------------------------------- /Create Docs and Update Docs: -------------------------------------------------------------------------------- 1 | function maker1() { 2 | const docName = 'Laurence Svekis'; 3 | const doc = DocumentApp.create(docName); 4 | Logger.log(doc.getId()); 5 | Logger.log(doc.getUrl()); 6 | } 7 | 8 | 9 | function update4(){ 10 | const id = '17DBrxrjkSCy6etqx1ynH2jmF0JTG1LFBf5Hejhq_32w'; 11 | const body = DocumentApp.openById(id).getBody(); 12 | const eles = body.getParagraphs(); 13 | eles.forEach((ele,ind)=>{ 14 | const val = ele.appendText(`Element #${ind+1}`); 15 | Logger.log(ele); 16 | }) 17 | Logger.log(eles); 18 | } 19 | 20 | function update3(){ 21 | const id = '17DBrxrjkSCy6etqx1ynH2jmF0JTG1LFBf5Hejhq_32w'; 22 | const body = DocumentApp.openById(id).getBody(); 23 | const ele = body.appendParagraph('HelloWorld'); 24 | const style = { 25 | BACKGROUND_COLOR: '#ff0000', 26 | FOREGROUND_COLOR: '#ffffff', 27 | BOLD: true 28 | }; 29 | ele.setAttributes(style); 30 | } 31 | 32 | 33 | function update2(){ 34 | const id = '17DBrxrjkSCy6etqx1ynH2jmF0JTG1LFBf5Hejhq_32w'; 35 | const doc = DocumentApp.openById(id); 36 | const body = doc.getBody(); 37 | const ele = body.appendParagraph('HelloWorld'); 38 | Logger.log(ele.getAttributes()); 39 | } 40 | 41 | 42 | function updater1(){ 43 | const id = '17DBrxrjkSCy6etqx1ynH2jmF0JTG1LFBf5Hejhq_32w'; 44 | const doc = DocumentApp.openById(id); 45 | const body = doc.getBody(); 46 | body.appendHorizontalRule(); 47 | const val = body.getNumChildren(); 48 | let temp = `Laurence Svekis ${val}`; 49 | body.appendParagraph(temp); 50 | const img = UrlFetchApp.fetch('http://www.discoveryvip.com/img/d.png'); 51 | body.appendImage(img.getBlob()); 52 | } 53 | 54 | function maker3(){ 55 | const docName = 'Test 1'; 56 | const doc = DocumentApp.create(docName); 57 | const id = doc.getId(); 58 | const body = doc.getBody(); 59 | let temp = `ID ${id}`; 60 | body.appendParagraph(temp); 61 | } 62 | 63 | 64 | function maker2(){ 65 | const docName = 'Laurence Svekis'; 66 | const ss = SpreadsheetApp.create(docName); 67 | const sheet = ss.getSheets()[0]; 68 | sheet.appendRow(['Name','Doc ID','Doc URL']); 69 | for(let i=0;i<3;i++){ 70 | const docName = `Laurence Svekis ${i+1}`; 71 | const doc = DocumentApp.create(docName); 72 | sheet.appendRow([docName,doc.getId(),doc.getUrl()]); 73 | } 74 | } 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /Create PDF from Google Slides: -------------------------------------------------------------------------------- 1 | function makePDF() { 2 | const id = '*******'; 3 | const fid = '*******'; 4 | const blob = DriveApp.getFileById(id).getBlob(); 5 | const folder = DriveApp.getFolderById(fid); 6 | //Logger.log(blob); 7 | const file = folder.createFile(blob); 8 | file.setName('LaurenceSvekis.pdf'); 9 | //const pdf = file.getAs('application/pdf'); 10 | //Logger.log(pdf); 11 | const email = Session.getActiveUser().getEmail(); 12 | MailApp.sendEmail(email,'PDF maker','New File',{ 13 | attachments : [file.getAs(MimeType.PDF)], 14 | name: 'My PDF' 15 | }) 16 | file.setTrashed(true); 17 | } 18 | 19 | 20 | function slidesPdf(){ 21 | const id = '1*******_BxME'; 22 | const fid = '*******'; 23 | const file = DriveApp.getFileById(id); 24 | const folder = DriveApp.getFolderById(fid); 25 | const main = SlidesApp.openById(id); 26 | const slides = main.getSlides(); 27 | let holder = SlidesApp.create('holder'); 28 | const holderID = holder.getId(); 29 | Logger.log(holderID); 30 | const holderFile = DriveApp.getFileById(holderID); 31 | Logger.log(holderFile); 32 | Logger.log(slides); 33 | slides.forEach((slide,index)=>{ 34 | holder.appendSlide(slide); 35 | holder.getSlides()[0].remove(); 36 | holder.saveAndClose(); 37 | let page = index + 1; 38 | folder.createFile(holderFile.getBlob()).setName('slide'+page+'.pdf'); 39 | holder = SlidesApp.openById(holderID); 40 | }) 41 | 42 | } 43 | 44 | -------------------------------------------------------------------------------- /Create UI menu with array of data: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | const ss = SpreadsheetApp.getActive(); 3 | const menu = [ 4 | {name:'test 1', functionName : 'test1'}, 5 | {name:'test 2', functionName : 'test2'}, 6 | {name:'test 3', functionName : 'test3'} 7 | ]; 8 | ss.addMenu('Extended',menu); 9 | } 10 | 11 | function test1(){ 12 | SpreadsheetApp.getActive().toast('test1'); 13 | } 14 | function test2(){ 15 | SpreadsheetApp.getActive().toast('test2'); 16 | } 17 | function test3(){ 18 | SpreadsheetApp.getActive().toast('test3'); 19 | } 20 | -------------------------------------------------------------------------------- /Create and Update Doc: -------------------------------------------------------------------------------- 1 | function myDocMaker() { 2 | const doc = DocumentApp.create('doc name'); 3 | Logger.log(doc.getId()); 4 | } 5 | 6 | function updateDoc(){ 7 | const id = '15ppjRsTnwQ'; 8 | const doc = DocumentApp.openById(id); 9 | doc.setName('THIS one'); 10 | const body = doc.getBody(); 11 | Logger.log(body); 12 | for(let x=0;x<10;x++){ 13 | const html = `New Paragraph ${x}`; 14 | body.appendParagraph(html); 15 | } 16 | //body.appendHorizontalRule(); 17 | } 18 | -------------------------------------------------------------------------------- /Create array prototype: -------------------------------------------------------------------------------- 1 | function searcher() { 2 | const searchString = 'test'; 3 | const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 4 | const searchCol = 2; 5 | //const data = sheet.getDataRange().getValues(); 6 | const range = sheet.getRange(2,searchCol,sheet.getLastRow()); 7 | const data = range.getValues(); 8 | Logger.log(data); 9 | const result = data.finder(searchString); 10 | Logger.log(result); 11 | } 12 | 13 | Array.prototype.finder = function(val){ 14 | if(val == "") return false; 15 | const arr = []; 16 | for(let i=0;i -1){ 18 | arr.push(i); 19 | } 20 | } 21 | return arr; 22 | } 23 | 24 | -------------------------------------------------------------------------------- /Dialogs Modals Server Side and Client Side code: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | SpreadsheetApp.getUi() 3 | .createMenu('Adv') 4 | .addItem('CS to SS','show7') 5 | .addItem('Model','show3') 6 | .addItem('Model less','show4') 7 | .addItem('Side Menu','show5') 8 | .addItem('Pop Up','show6') 9 | .addSeparator() 10 | .addItem('Alert','show1') 11 | .addItem('Prompt','show2') 12 | .addToUi(); 13 | } 14 | 15 | function getData(){ 16 | const html = '

Hello World

' 17 | const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); 18 | Logger.log(data); 19 | return data; 20 | } 21 | 22 | function run1(val){ 23 | const ui = SpreadsheetApp.getUi(); 24 | let message = 'Clicked ' + val; 25 | ui.alert(message); 26 | } 27 | 28 | function show7(){ 29 | const html = HtmlService.createHtmlOutputFromFile('loader'); 30 | SpreadsheetApp.getUi() 31 | .showModelessDialog(html,'Client Side to Server Side'); 32 | } 33 | 34 | function show6(){ 35 | const html = HtmlService.createHtmlOutputFromFile('show3'); 36 | SpreadsheetApp.getUi() 37 | .showDialog(html); // Deprecated Method 38 | } 39 | 40 | function show5(){ 41 | const html = HtmlService.createHtmlOutputFromFile('show3'); 42 | Logger.log(html); 43 | html.setTitle('Hello World'); 44 | SpreadsheetApp.getUi() 45 | .showSidebar(html); 46 | } 47 | 48 | function show4(){ 49 | const html = HtmlService.createHtmlOutput('

Hello

'); 50 | Logger.log(html); 51 | html.setHeight(400); 52 | html.setWidth(800); 53 | //html.setContent('

Wow

'); 54 | SpreadsheetApp.getUi() 55 | .showModelessDialog(html,'Modeless'); 56 | } 57 | 58 | function show3(){ 59 | const html = HtmlService.createHtmlOutputFromFile('show3'); 60 | Logger.log(html); 61 | SpreadsheetApp.getUi() 62 | .showModalDialog(html,'My Modal'); 63 | } 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | function checker(ui){ 74 | const res = ui.prompt('Your Name Please?',ui.ButtonSet.OK_CANCEL); 75 | const btn = res.getSelectedButton(); 76 | const mes = res.getResponseText(); 77 | if(btn == ui.Button.OK && mes.length >0){ 78 | return 'Welcome, '+mes; 79 | }else{ 80 | return checker(ui); 81 | } 82 | } 83 | 84 | function show2(){ 85 | const ui = SpreadsheetApp.getUi(); 86 | let message = checker(ui); 87 | ui.alert(message); 88 | } 89 | 90 | function show1(){ 91 | const ui = SpreadsheetApp.getUi(); 92 | const res = ui.alert('Ready?',ui.ButtonSet.YES_NO_CANCEL); 93 | Logger.log(res); 94 | let message = ''; 95 | if(res == ui.Button.YES){ 96 | message = 'Was Yes'; 97 | }else if (res == ui.Button.NO){ 98 | message = 'Oh NO!'; 99 | }else if (res == ui.Button.CANCEL){ 100 | message = 'Was Cancelled!'; 101 | }else if (res == ui.Button.CLOSE){ 102 | message = 'Really closed!!!'; 103 | }else{ 104 | message = 'No response'; 105 | } 106 | ui.alert(message); 107 | } 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | Hello World 117 | 118 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 136 | 137 | 138 |
139 | 140 | 141 | 142 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /Docsand replacetext: -------------------------------------------------------------------------------- 1 | 2 | function makerPDF1(){ 3 | const folderID ='1f6jFkkEhxhvUtP7gY-3-vMrfANle6DJG'; 4 | const desFolder = DriveApp.getFolderById(folderID); 5 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 6 | const tempDoc = DriveApp.getFileById(tempID ); 7 | const newDoc = tempDoc.makeCopy('test1',desFolder); 8 | const blob = newDoc.getAs(MimeType.PDF); 9 | const pdf = desFolder.createFile(blob).setName('test1.pdf'); 10 | } 11 | 12 | 13 | function updateDoc3() { 14 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 15 | const sheetID = '1G7yTIKlDP90aXC12tCXOZ_5QLgxE_QI0hwpDQCDDWgM' 16 | const tempDoc = DriveApp.getFileById(tempID ); 17 | const ss = SpreadsheetApp.openById(sheetID); 18 | const sheet = ss.getSheets()[0]; 19 | const data = sheet.getDataRange().getValues(); 20 | const rows = data.slice(1); 21 | rows.forEach((row,index)=>{ 22 | const newDoc = tempDoc.makeCopy(row[0]); 23 | const body = DocumentApp.openById(newDoc.getId()).getBody(); 24 | data[0].forEach((heading,col)=>{ 25 | const tempHeading = heading.toUpperCase(); 26 | body.replaceText(`{${tempHeading}}`,row[col]); 27 | }) 28 | const temp = sheet.getRange(index+2,5,1,1); 29 | temp.setValue(true); 30 | }) 31 | } 32 | 33 | 34 | 35 | function testData1(){ 36 | const sheetID = '1G7yTIKlDP90aXC12tCXOZ_5QLgxE_QI0hwpDQCDDWgM' 37 | const ss = SpreadsheetApp.openById(sheetID); 38 | const sheet = ss.getSheets()[0]; 39 | const data = sheet.getDataRange().getValues(); 40 | const rows = data.slice(1); 41 | rows.forEach((row,index)=>{ 42 | Logger.log(row); 43 | const temp = sheet.getRange(index+2,5,1,1); 44 | temp.setValue(false); 45 | }) 46 | //Logger.log(rows); 47 | } 48 | 49 | 50 | function updateDoc2() { 51 | const tempID = '1zLgTEc5-OUrOTsQollYDv_d_fdKVK74fyyr5Q63wMA0'; 52 | const tempDoc = DriveApp.getFileById(tempID ); 53 | const newDoc = tempDoc.makeCopy('new 2'); 54 | const doc = DocumentApp.openById(newDoc.getId()); 55 | const body = doc.getBody(); 56 | const user = {first:'Laurence',last:'Svekis',id:15} 57 | body.replaceText('{FIRST}',user.first); 58 | body.replaceText('{LAST}',user.last); 59 | body.replaceText('{ID}',user.id); 60 | } 61 | 62 | 63 | 64 | function updateDoc1() { 65 | const id = '1wHdzWZnt_W4y-93k-_T_ZLrDzqc06QIYx45-CW7iL8c'; 66 | const doc = DocumentApp.openById(id); 67 | const body = doc.getBody(); 68 | Logger.log(body); 69 | const user = {first:'Laurence',last:'Svekis',id:15} 70 | body.replaceText('{FIRST}',user.first); 71 | body.replaceText('{LAST}',user.last); 72 | body.replaceText('{ID}',user.id); 73 | } 74 | -------------------------------------------------------------------------------- /Gmail App Labels: -------------------------------------------------------------------------------- 1 | function applyLabel() { 2 | const threads = GmailApp.getInboxThreads(); 3 | const myLabel = 'NEW Email Today'; 4 | const holder = []; 5 | GmailApp.getUserLabels().forEach((labelName)=>{ 6 | holder.push(labelName.getName()); 7 | }) 8 | Logger.log(holder); 9 | let tempLabel; 10 | if(holder.includes(myLabel)){ 11 | tempLabel = GmailApp.getUserLabelByName(myLabel); 12 | }else{ 13 | tempLabel = GmailApp.createLabel(myLabel); 14 | } 15 | Logger.log(tempLabel); 16 | threads.forEach((message)=>{ 17 | //Logger.log(message); 18 | const firstMes = message.getFirstMessageSubject(); 19 | if(firstMes.includes('new')){ 20 | message.addLabel(tempLabel); 21 | message.moveToArchive(); 22 | message.markRead(); 23 | } 24 | }) 25 | } 26 | 27 | function checker(){ 28 | const tempMessage = GmailApp.getUserLabelByName('NEW Email Today'); 29 | const threads = tempMessage.getThreads(); 30 | threads.forEach((thread)=>{ 31 | thread.markUnread(); 32 | //thread.reply('Thank you!!!'); 33 | thread.removeLabel(tempMessage); 34 | thread.moveToInbox(); 35 | Logger.log(thread.getMessageCount()); 36 | const messages = thread.getMessages(); 37 | messages.forEach((message)=>{ 38 | Logger.log(message.getSubject()); 39 | }) 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /Google Doc as HTML into a webapp dynamically: -------------------------------------------------------------------------------- 1 | function doGet(e){ 2 | let id = '1Ypgk3FCRN-70jvWwKKEUll7zIfTY'; 3 | if('id' in e.parameter){ 4 | id = e.parameter['id'] 5 | } 6 | let html = '

Laurence Svekis

'; 7 | const url = 'https://docs.google.com/feeds/download/documents/export/Export?id='+id+'&exportFormat=html'; 8 | const param = { 9 | method :"get", 10 | headers : { 11 | "Authorization":"Bearer "+ScriptApp.getOAuthToken() 12 | }, 13 | muteHttpExceptions:true 14 | }; 15 | html = UrlFetchApp.fetch(url,param).getContentText(); 16 | return HtmlService.createHtmlOutput(html); 17 | } 18 | 19 | function testHTML(){ 20 | const id = '1Ypgk3FCRN-s70jvWwKKEUll7zIfTY'; 21 | const url = 'https://docs.google.com/feeds/download/documents/export/Export?id='+id+'&exportFormat=html'; 22 | const param = { 23 | method :"get", 24 | headers : { 25 | "Authorization":"Bearer "+ScriptApp.getOAuthToken() 26 | }, 27 | muteHttpExceptions:true 28 | }; 29 | html = UrlFetchApp.fetch(url,param).getContentText(); 30 | Logger.log(html); 31 | } 32 | 33 | -------------------------------------------------------------------------------- /Google Sheet Data API: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Code Example 5 | 10 | 11 | 12 |
13 |
14 | Hello World 15 |
16 |
17 | 18 | 19 | 20 | 21 | const id = '14GOII3wSZGr3cnZ4Cu20LVQN9YflkR5EQQnNs0N6bjo'; 22 | const base = 'https://docs.google.com/spreadsheets/d/'; 23 | const query = 'SELECT *'; 24 | const url = 'https://docs.google.com/spreadsheets/d/14GOII3wSZGr3cnZ4Cu20LVQN9YflkR5EQQnNs0N6bjo/gviz/tq?tqx=out:csv&sheet=Sheet%201&tq=SELECT%20*'; 25 | const output = document.querySelector('.output'); 26 | 27 | 28 | function getData(){ 29 | const tq = '/gviz/tq?tqx=out:json&tq='; 30 | const endPoint = `${base}${id}${tq}`; 31 | //console.log(endPoint); 32 | fetch(endPoint).then(res=>res.text()) 33 | .then(data => { 34 | //console.log(data); 35 | let temp = data.replace('/*O_o*/',''); 36 | temp = temp.replace('google.visualization.Query.setResponse(',''); 37 | temp = temp.replace(');',''); 38 | //console.log(temp); 39 | const jsonData = JSON.parse(temp); 40 | outputData(jsonData.table); 41 | }) 42 | } 43 | 44 | getData(); 45 | 46 | function outputData(data){ 47 | //console.log(data); 48 | const arr = []; 49 | const arr2 = []; 50 | data.cols.forEach((col)=>{ 51 | //console.log(col.label); 52 | if(col.label){ 53 | arr2.push(col.label); 54 | } 55 | }) 56 | arr.push(arr2); 57 | data.rows.forEach(row=>{ 58 | //console.log(row.c); 59 | const holder = []; 60 | /* row.c.forEach(cell=>{ 61 | if(cell != null){ 62 | holder.push(cell.v); 63 | } 64 | //console.log(cell); 65 | }) */ 66 | for(let x=0;x{ 82 | const main = document.createElement('div'); 83 | if(vals[3] == true){ 84 | main.style.backgroundColor = 'green'; 85 | }else{ 86 | main.style.backgroundColor = 'red'; 87 | } 88 | if(ind==0){ 89 | main.style.backgroundColor = 'black'; 90 | main.style.fontSize = '1.2em'; 91 | } 92 | main.style.color = 'white'; 93 | main.style.textAlign = 'center'; 94 | vals.forEach((val)=>{ 95 | const span = document.createElement('span'); 96 | let spacer = val == '' ? '-' : val; 97 | span.textContent = spacer ; 98 | span.style.border = '1px solid #ddd'; 99 | span.style.width = '25%'; 100 | span.style.display = 'inline-block'; 101 | 102 | main.append(span); 103 | }) 104 | output.append(main); 105 | }) 106 | } 107 | 108 | 109 | -------------------------------------------------------------------------------- /Google Sheet Data as JSON for AJAX data: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sheet Quiz 5 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | const url = 'https://script.google.com/macros/s/AKfycbxWcrVQhM0jX3bypudDtbquimzCceSWr3Ma4kwNKpHENA0EOXwSqvgQVpMXdVBDce7wQQ/exec'; 42 | const output = document.querySelector('.output'); 43 | const game = {question:0,total:0,data:[],score:0}; 44 | document.addEventListener('DOMContentLoaded',init); 45 | 46 | function init(){ 47 | console.log('ready'); 48 | output.innerHTML = ''; 49 | const btn = document.createElement('button'); 50 | btn.disabled = true; 51 | start(btn); 52 | game.question = 0; 53 | game.total = 0; 54 | game.score = 0; 55 | game.data =[]; 56 | fetch(url) 57 | .then(res => res.json()) 58 | .then((data)=>{ 59 | console.log(data); 60 | game.total = data.data.length; 61 | game.data = data.data; 62 | btn.disabled = false; 63 | }) 64 | } 65 | 66 | function start(btn){ 67 | const html = `Welcome to the quiz. Press the button below to start the QUIZ.`; 68 | const div = maker('div',html,'message',output); 69 | btn.textContent = 'Start Game'; 70 | btn.classList.add('btn'); 71 | div.append(btn); 72 | btn.addEventListener('click',loadQuestion); 73 | } 74 | 75 | function loadQuestion(){ 76 | output.innerHTML = ''; 77 | if(game.question >= game.total){ 78 | const html = `

Game Over

You got ${game.score} out of ${game.total} correct.
`; 79 | const div = maker('div',html,'message',output); 80 | const btn3 = maker('button','Play Again','btn', div); 81 | btn3.addEventListener('click',init); 82 | }else{ 83 | const div = maker('div','','message',output); 84 | const val = game.data[game.question]; 85 | //console.log(val.question); 86 | const question = maker('div',`${val.question}?`,'question',div); 87 | const optList = maker('div','','opts',div); 88 | val.arr.forEach((opt)=>{ 89 | ///console.log(opt); 90 | const temp = maker('div',opt,'box',optList); 91 | temp.classList.add('box1'); 92 | temp.myObj = { 93 | opt:opt, 94 | answer:val.answer 95 | }; 96 | temp.addEventListener('click',checker); 97 | }) 98 | } 99 | //console.log('question'); 100 | } 101 | function checker(e){ 102 | const val = e.target.myObj; 103 | //console.log(val.opt); 104 | //console.log(val.answer); 105 | removeClicks(); 106 | e.target.style.color = 'white'; 107 | let html = ''; 108 | if(val.opt == val.answer){ 109 | game.score++; 110 | e.target.style.backgroundColor = 'green'; 111 | html = `Correct!`; 112 | }else{ 113 | e.target.style.backgroundColor = 'red'; 114 | html = `Wrong!`; 115 | } 116 | const parent = e.target.parentElement; 117 | console.log(parent); 118 | game.question++; 119 | const rep = game.question == game.total ? 'End Game' : 'Next Question'; 120 | const feedback = maker('div',html,'message',parent); 121 | const btn2 = maker('button',rep,'btn',parent); 122 | btn2.addEventListener('click',loadQuestion); 123 | } 124 | 125 | function removeClicks(){ 126 | const boxes = document.querySelectorAll('.box'); 127 | boxes.forEach((ele)=>{ 128 | ele.removeEventListener('click',checker); 129 | ele.style.color = '#ddd'; 130 | ele.classList.remove('box1'); 131 | }) 132 | } 133 | 134 | function maker(eleType,html,cla,parent){ 135 | const ele = document.createElement(eleType); 136 | ele.innerHTML = html; 137 | ele.classList.add(cla); 138 | return parent.appendChild(ele); 139 | } 140 | 141 | -------------------------------------------------------------------------------- /Google Sheet as array Data: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Code Example 5 | 10 | 11 | 12 |
13 |
14 | Hello World 15 |
16 |
17 | 18 | 19 | 20 | 21 | const id = '14GOII3wSZGr3cnZ4Cu20LVQN9YflkR5EQQnNs0N6bjo'; 22 | const base = 'https://docs.google.com/spreadsheets/d/'; 23 | const query = 'SELECT *'; 24 | const url = 'https://docs.google.com/spreadsheets/d/14GOII3wSZGr3cnZ4Cu20LVQN9YflkR5EQQnNs0N6bjo/gviz/tq?tqx=out:csv&sheet=Sheet%201&tq=SELECT%20*'; 25 | const output = document.querySelector('.output'); 26 | 27 | 28 | function getData(){ 29 | const tq = '/gviz/tq?tqx=out:json&tq='; 30 | const endPoint = `${base}${id}${tq}`; 31 | //console.log(endPoint); 32 | fetch(endPoint).then(res=>res.text()) 33 | .then(data => { 34 | //console.log(data); 35 | let temp = data.replace('/*O_o*/',''); 36 | temp = temp.replace('google.visualization.Query.setResponse(',''); 37 | temp = temp.replace(');',''); 38 | //console.log(temp); 39 | const jsonData = JSON.parse(temp); 40 | outputData(jsonData.table); 41 | }) 42 | } 43 | 44 | getData(); 45 | 46 | function outputData(data){ 47 | //console.log(data); 48 | const arr = []; 49 | const arr2 = []; 50 | data.cols.forEach((col)=>{ 51 | //console.log(col.label); 52 | if(col.label){ 53 | arr2.push(col.label); 54 | } 55 | }) 56 | arr.push(arr2); 57 | data.rows.forEach(row=>{ 58 | //console.log(row.c); 59 | const holder = []; 60 | /* row.c.forEach(cell=>{ 61 | if(cell != null){ 62 | holder.push(cell.v); 63 | } 64 | //console.log(cell); 65 | }) */ 66 | for(let x=0;x{ 82 | const main = document.createElement('div'); 83 | if(vals[3] == true){ 84 | main.style.backgroundColor = 'green'; 85 | }else{ 86 | main.style.backgroundColor = 'red'; 87 | } 88 | if(ind==0){ 89 | main.style.backgroundColor = 'black'; 90 | main.style.fontSize = '1.2em'; 91 | } 92 | main.style.color = 'white'; 93 | main.style.textAlign = 'center'; 94 | vals.forEach((val)=>{ 95 | const span = document.createElement('span'); 96 | let spacer = val == '' ? '-' : val; 97 | span.textContent = spacer ; 98 | span.style.border = '1px solid #ddd'; 99 | span.style.width = '25%'; 100 | span.style.display = 'inline-block'; 101 | 102 | main.append(span); 103 | }) 104 | output.append(main); 105 | }) 106 | } 107 | 108 | 109 | -------------------------------------------------------------------------------- /Google Sheets/copyTo Examples: -------------------------------------------------------------------------------- 1 | function formatOnlyCopy(){ 2 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 | const sheet1 = ss.getSheetByName('Sheet1').getDataRange(); 4 | const sheet5 = ss.getSheetByName('Sheet5').getDataRange(); 5 | sheet1.copyTo(sheet5,{formatOnly:true}); 6 | } 7 | 8 | function contentOnlyCopy(){ 9 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 10 | const sheet1 = ss.getSheetByName('Sheet1').getDataRange(); 11 | const sheet4 = ss.getSheetByName('Sheet4').getDataRange(); 12 | sheet1.copyTo(sheet4,{contentsOnly:true}); 13 | } 14 | 15 | function copytoSheet(){ 16 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 17 | const sheet1 = ss.getSheetByName('Sheet1').getDataRange(); 18 | const sheet2 = ss.getSheetByName('Sheet3').getDataRange(); 19 | sheet1.copyTo(sheet2); 20 | 21 | } 22 | 23 | function rows3Only(){ 24 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 25 | const sourceSheet = ss.getSheetByName('Sheet1'); 26 | const sourceRange = sourceSheet.getRange(1,1,3,4); 27 | const desSheet = ss.insertSheet().setName('test 1000'); 28 | sourceRange.copyTo(desSheet.getDataRange()); 29 | } 30 | 31 | function sheetSameSheet(){ 32 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 33 | const sheets = ss.getSheets(); 34 | sheets.forEach((sheet)=>{ 35 | Logger.log(sheet.getName()); 36 | }) 37 | const sourceSheet = ss.getSheets()[0]; 38 | const rangeSource = sourceSheet.getRange("A:B"); 39 | const rangeDest = sourceSheet.getRange("D1"); 40 | rangeSource.copyTo(rangeDest); 41 | // Logger.log(range); 42 | } 43 | 44 | function getDataMakeNewSheet() { 45 | const ss = SpreadsheetApp.getActiveSpreadsheet(); 46 | const sourceSheet = ss.getSheetByName('Sheet1'); 47 | sourceSheet.copyTo(ss).setName('Test123').activate(); 48 | Logger.log(ss); 49 | } 50 | -------------------------------------------------------------------------------- /HTMLService Code Examples: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 |
    12 | { ?>
  • 13 |
  • 14 |
15 | 16 | 5) { ?> 17 |
Was larger than 5
18 | 19 |
Was SMALLER than 5
20 |
21 | 22 |
23 |
24 |
25 |
26 |
27 |
28 | 29 | 30 | 31 | 32 | 33 | function doGet(){ 34 | const html = HtmlService.createTemplateFromFile('index'); 35 | html.data = { 36 | output : '
Laurence Svekis
', 37 | str : 'Hello World', 38 | val : 1 39 | }; 40 | return html.evaluate(); 41 | } 42 | 43 | function include(filename){ 44 | return HtmlService.createHtmlOutputFromFile(filename).getContent(); 45 | } 46 | 47 | function findBugs(){ 48 | Logger.log(HtmlService.createTemplateFromFile('index').getCode()); 49 | } 50 | 51 | 52 | 53 | 54 | function adder(row){ 55 | const id = '1zhez9FBfGRjs8SRK58SjJ2BTu8Pspud_10h1A_TntCc'; 56 | const data = SpreadsheetApp.openById(id).getSheetByName('quiz').getDataRange().getValues(); 57 | return JSON.stringify(data[row][0]); 58 | } 59 | 60 | /* function doGet(e){ 61 | const html = '

Laurence Svekis

'; 62 | return HtmlService.createHtmlOutput(html); 63 | } */ 64 | 65 |

Hello World

66 |
Laurence Svekis
67 | 68 | 73 | 74 | 79 | -------------------------------------------------------------------------------- /HTMLService Parameter: -------------------------------------------------------------------------------- 1 | function doGet(e){ 2 | const vals = JSON.stringify(e); 3 | let html = '

Hello

'; 4 | if('name' in e.parameters){ 5 | html += '
'+e.parameters['name'][0]+'
'; 6 | 7 | } 8 | if('name' in e.parameter){ 9 | html += '

'+e.parameter['name']+'

'; 10 | } 11 | if('row' in e.parameter){ 12 | const row = e.parameter['row'] -1; 13 | const id = '1zhez9FBfGRjs8SRK58SjJ2BTu8Pspud_10h1A_TntCc'; 14 | const data = SpreadsheetApp.openById(id).getSheetByName('data1').getDataRange().getValues(); 15 | if(row < data.length){ 16 | html += '

'+JSON.stringify(data[row])+'

'; 17 | }else{ 18 | html += '

Row was not available

'; 19 | } 20 | } 21 | html += ''+vals+''; 22 | return HtmlService.createHtmlOutput(html); 23 | } 24 | 25 | /* function doGet(){ 26 | return HtmlService.createHtmlOutputFromFile('index'); 27 | } */ 28 | -------------------------------------------------------------------------------- /PDF Creator from Doc template: -------------------------------------------------------------------------------- 1 | const SHEETID = '1wZLJE*****fm4'; 2 | const DOCID = '1RwP*****5U'; 3 | const FOLDERID = '1*****or1fHaV4'; 4 | 5 | function onOpen(){ 6 | SpreadsheetApp.getUi() 7 | .createMenu('Email Out') 8 | .addItem('Send Emails','sender') 9 | .addToUi(); 10 | } 11 | 12 | function sender() { 13 | const sheet = SpreadsheetApp.openById(SHEETID).getSheetByName('data'); 14 | const data = sheet.getDataRange().getValues(); 15 | 16 | const temp = DriveApp.getFileById(DOCID); 17 | const folder = DriveApp.getFolderById(FOLDERID); 18 | 19 | const rows = data.slice(1); 20 | rows.forEach((row,index)=>{ 21 | if(row[4] == ''){ 22 | const file = temp.makeCopy(folder); 23 | const doc = DocumentApp.openById(file.getId()); 24 | const body = doc.getBody(); 25 | data[0].forEach((heading,i)=>{ 26 | const header1 = heading.toUpperCase(); 27 | body.replaceText(`{${header1}}`,row[i]); 28 | }) 29 | doc.setName(row[0]+row[1]); 30 | const blob = doc.getAs(MimeType.PDF); 31 | doc.saveAndClose(); 32 | const pdf = folder.createFile(blob).setName(row[0]+row[1]+'.pdf'); 33 | const email = row[3]; 34 | const subject = row[0]+row[1]+'new file created'; 35 | const messageBody = `Hi, ${row[0]} Welcome we've created a PDF for you!`; 36 | MailApp.sendEmail({ 37 | to:email, 38 | subject:subject, 39 | htmlBody: messageBody, 40 | attachments: [blob.getAs(MimeType.PDF)] 41 | }); 42 | const tempo = sheet.getRange(index+2,5,1,1); 43 | tempo.setValue(new Date()); 44 | file.setTrashed(true); 45 | } 46 | }) 47 | 48 | } 49 | -------------------------------------------------------------------------------- /Remove Duplicate Rows of Data: -------------------------------------------------------------------------------- 1 | function onOpen(){ 2 | const ui = SpreadsheetApp.getUi(); 3 | ui.createMenu('plus') 4 | .addItem('remove dup rows','dupsRemover') 5 | .addToUi(); 6 | } 7 | 8 | 9 | function dupsRemover() { 10 | const sheet = SpreadsheetApp.getActiveSheet(); 11 | const data = sheet.getDataRange().getValues(); 12 | const dataClean = []; 13 | Logger.log(data); 14 | data.forEach(row=>{ 15 | Logger.log(row); 16 | let boo = false; 17 | dataClean.forEach(rowClean=>{ 18 | if(rowClean.join() == row.join()){ 19 | boo = true; 20 | } 21 | }) 22 | if(!boo){ 23 | dataClean.push(row); 24 | } 25 | }) 26 | Logger.log(dataClean); 27 | sheet.clearContents(); 28 | const range = sheet.getRange(1,1,dataClean.length,dataClean[0].length); 29 | range.setValues(dataClean); 30 | } 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Sheet API Final: -------------------------------------------------------------------------------- 1 | const SHEETID = '1K4kLsAnxxwWoKoZObTrsNSbP0oqbF_-lAxfXKDspKkQ'; 2 | const PAGE = 3; 3 | function catFinder(e){ 4 | if('cat' in e.parameters){ 5 | return e.parameters['cat'][0]; 6 | } 7 | return null; 8 | } 9 | function pageFinder(e){ 10 | if('pg' in e.parameters){ 11 | let num = Number(e.parameters['pg'][0]); 12 | if(num){return num; } 13 | 14 | } 15 | return 1; 16 | } 17 | 18 | function doGet(e){ 19 | const ss = SpreadsheetApp.openById(SHEETID); 20 | let cat = catFinder(e) ; 21 | let pg = pageFinder(e) ; 22 | //let cat = ''; 23 | //let pg = 2; 24 | const sheet = ss.getSheetByName('jokes'); 25 | const rows = sheet.getDataRange().getValues(); 26 | const headings = rows[0].map(heading =>{ 27 | return heading.toString().toLowerCase(); 28 | }) 29 | const data = rows.slice(1); 30 | let dataObj = makeObj(data,headings); 31 | if(cat){ 32 | dataObj = dataObj.filter(item => item.category === cat); 33 | } 34 | const start = (pg * PAGE)-PAGE; 35 | const myData = dataObj.splice(start,PAGE); 36 | myData.forEach(item =>{ 37 | Logger.log(item); 38 | }) 39 | Logger.log(myData); 40 | const pagesTotal = Math.ceil(dataObj.length / PAGE); 41 | //Logger.log(headings); 42 | //Logger.log(data); 43 | return outputContent(myData,pagesTotal,cat,pg); 44 | } 45 | 46 | function makeObj(data,headings){ 47 | const temp1 = data.map((arr)=>{ 48 | const obj = {}; 49 | headings.forEach((heading,index)=>{ 50 | obj[heading] = arr[index]; 51 | }) 52 | return obj; 53 | }) 54 | return temp1; 55 | } 56 | 57 | function outputContent(data,pagesTotal,cat,pg){ 58 | const temp = JSON.stringify({ 59 | status : 'success', 60 | data : data, 61 | total : pagesTotal, 62 | cats : getCats(), 63 | cur: pg, 64 | cat : cat 65 | }) 66 | return ContentService.createTextOutput(temp).setMimeType(ContentService.MimeType.JSON); 67 | } 68 | 69 | 70 | function getCats(){ 71 | const ss = SpreadsheetApp.openById(SHEETID); 72 | const sheet = ss.getSheetByName('category'); 73 | const rows = sheet.getDataRange().getValues(); 74 | const data = rows.slice(1); 75 | const holder = []; 76 | data.forEach((el)=>{ 77 | holder.push(el[0]); 78 | }) 79 | return holder; 80 | } 81 | 82 | 83 | 84 | 85 | 86 | Sheets API 87 | 88 | 89 | 90 |
91 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Sheet as JSON/Fetch Connection: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Share your Google Sheets 5 | 12 | 13 | 14 |

Google Sheets as JSON data for your Website

15 |
16 |

Google Sheets can be used as a source for data to your webpages. New updated API can now use Database like 17 | Select options to output the content. 18 |

19 |
20 |
21 | 22 | 23 | 24 | 25 | //https://docs.google.com/spreadsheets/d/1EgnjzKuodX9tdwUqtW92WSdlIBZvTnrgf9cXgGGL03Y/edit?usp=sharing 26 | const output = document.querySelector('.output'); 27 | const url = 'https://docs.google.com/spreadsheets/d/'; 28 | const ssid = '1EgnjzKuodX9tdwUqtW92WSdlIBZvTnrgf9cXgGGL03Y'; 29 | const query1 = `/gviz/tq?`; 30 | const endpoint1 = `${url}${ssid}${query1}`; 31 | fetch(endpoint1) 32 | .then(res => res.text()) 33 | .then(data => { 34 | const temp = data.substr(47).slice(0, -2); 35 | const json = JSON.parse(temp); 36 | const rows = json.table.rows; 37 | rows.forEach((row) => { 38 | const div = document.createElement('div'); 39 | const temp1 = row.c; 40 | temp1.forEach((cell) => { 41 | const box = document.createElement('div'); 42 | box.textContent = cell.v; 43 | box.classList.add('box'); 44 | div.append(box); 45 | }) 46 | output.append(div); 47 | }) 48 | }) 49 | -------------------------------------------------------------------------------- /Sheet as JSON/JSON data with Headings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Share your Google Sheets 5 | 20 | 21 | 22 |

Google Sheets as JSON data for your Website

23 |
24 |

Google Sheets can be used as a source for data to your webpages. New updated API can now use Database like 25 | Select options to output the content. 26 |

27 | 28 |
29 |
30 | 31 | 32 | 33 | 34 | const output = document.querySelector('.output'); 35 | const btn = document.querySelector('button'); 36 | const url = 'https://docs.google.com/spreadsheets/d/'; 37 | const ssid = '1EgnjzKuodX9tdwUqtW92WSdlIBZvTnrgf9cXgGGL03Y'; 38 | const q1 = '/gviz/tq?'; 39 | const q2 = 'tqx=out:json'; 40 | const q3 = 'sheet=Sheet6'; 41 | 42 | btn.addEventListener('click',getData); 43 | 44 | function getData(){ 45 | let url1 = `${url}${ssid}${q1}&${q2}&${q3}`; 46 | output.innerHTML = ''; 47 | fetch(url1) 48 | .then(res => res.text()) 49 | .then(data => { 50 | const json = JSON.parse(data.substr(47).slice(0,-2)); 51 | console.log(json.table); 52 | const headings = makeCell(output,'','heading'); 53 | json.table.cols.forEach((col)=>{ 54 | const el = makeCell(headings,col.label,'box'); 55 | }) 56 | json.table.rows.forEach((row)=>{ 57 | //console.log(row); 58 | const div = makeCell(output,'','row'); 59 | row.c.forEach((cell)=>{ 60 | const ele1 = makeCell(div,`${cell.v}`,'box'); 61 | }) 62 | }) 63 | 64 | }) 65 | } 66 | 67 | function makeCell(parent,html,classAdd){ 68 | const ele = document.createElement('div'); 69 | parent.append(ele); 70 | ele.innerHTML = html; 71 | ele.classList.add(classAdd); 72 | return ele; 73 | } 74 | 75 | -------------------------------------------------------------------------------- /Sheet as JSON/JSON sheet path Generator: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Share your Google Sheets 5 | 22 | 23 | 24 |

Google Sheets as JSON data for your Website

25 |
26 |

Google Sheets can be used as a source for data to your webpages. New updated API can now use Database like 27 | Select options to output the content. 28 |

29 | 30 | 31 | 32 |
35 | 36 | 37 |
38 | 39 |
40 |
41 | 42 | 43 | 44 | const output = document.querySelector('.output'); 45 | const btn = document.querySelector('button'); 46 | const myQuery = document.querySelector('.myQuery'); 47 | const mySheet = document.querySelector('.mySheet'); 48 | const sheets = document.querySelector('.sheets'); 49 | const sheetArr = ['test1', 'Sheet2', 'Sheet6', 'people']; 50 | sheetArr.forEach((sheet) => { 51 | const tempEle = makeCell(sheets, sheet, 'ele', 'option'); 52 | tempEle.value = sheet; 53 | }) 54 | const url = 'https://docs.google.com/spreadsheets/d/'; 55 | const q1 = '/gviz/tq?'; 56 | const q2 = 'tqx=out:json'; 57 | //const query1 = 'select A,B where C > 100 '; 58 | //const query1 = `select A,B,C,E where E contains 'a' limit 3`; 59 | //const query1 = `select A,B`; 60 | //const q4 = encodeURIComponent(query1); 61 | btn.addEventListener('click', getData); 62 | 63 | function getData() { 64 | const ssid = mySheet.value; 65 | const q3 = `sheet=${sheets.value}`; 66 | let url1 = `${url}${ssid}${q1}&${q2}&${q3}`; 67 | if (myQuery.value.length > 0) { 68 | const updateCode = encodeURIComponent(myQuery.value); 69 | url1 += `&tq=${updateCode}`; 70 | } 71 | output.innerHTML = url1; 72 | fetch(url1) 73 | .then(res => res.text()) 74 | .then(data => { 75 | 76 | const json = JSON.parse(data.substr(47).slice(0, -2)); 77 | //console.log(json); 78 | const headings = makeCell(output, '', 'heading'); 79 | let wid = 100 / json.table.cols.length; 80 | json.table.cols.forEach((col) => { 81 | console.log(col); 82 | const val = col.label || col.id; 83 | const el = makeCell(headings, val, 'box'); 84 | el.style.width = wid + '%'; 85 | }) 86 | json.table.rows.forEach((row) => { 87 | //console.log(row); 88 | const div = makeCell(output, '', 'row'); 89 | row.c.forEach((cell) => { 90 | const ele1 = makeCell(div, `${cell.v}`, 'box'); 91 | ele1.style.width = wid + '%'; 92 | }) 93 | }) 94 | 95 | }) 96 | } 97 | 98 | function makeCell(parent, html, classAdd, eleType = 'div') { 99 | const ele = document.createElement(eleType); 100 | parent.append(ele); 101 | ele.innerHTML = html; 102 | ele.classList.add(classAdd); 103 | return ele; 104 | } 105 | -------------------------------------------------------------------------------- /Sheet as JSON/Sheet Data with Query Language: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Share your Google Sheets 5 | 20 | 21 | 22 |

Google Sheets as JSON data for your Website

23 |
24 |

Google Sheets can be used as a source for data to your webpages. New updated API can now use Database like 25 | Select options to output the content. 26 |

27 | 28 |
29 |
30 | 31 | 32 | 33 | 34 | const output = document.querySelector('.output'); 35 | const btn = document.querySelector('button'); 36 | const url = 'https://docs.google.com/spreadsheets/d/'; 37 | const ssid = '1EgnjzKuodX9tdwUqtW92WSdlIBZvTnrgf9cXgGGL03Y'; 38 | const q1 = '/gviz/tq?'; 39 | const q2 = 'tqx=out:json'; 40 | const q3 = 'sheet=Sheet6'; 41 | //const query1 = 'select A,B where C > 100 '; 42 | const query1 = `select A,B,C,E where E contains 'a' limit 3`; 43 | const q4 = encodeURIComponent(query1); 44 | btn.addEventListener('click',getData); 45 | function getData(){ 46 | let url1 = `${url}${ssid}${q1}&${q2}&${q3}&tq=${q4}`; 47 | output.innerHTML = url1; 48 | fetch(url1) 49 | .then(res => res.text()) 50 | .then(data => { 51 | const json = JSON.parse(data.substr(47).slice(0,-2)); 52 | console.log(json.table); 53 | const headings = makeCell(output,'','heading'); 54 | json.table.cols.forEach((col)=>{ 55 | const el = makeCell(headings,col.id,'box'); 56 | }) 57 | json.table.rows.forEach((row)=>{ 58 | //console.log(row); 59 | const div = makeCell(output,'','row'); 60 | row.c.forEach((cell)=>{ 61 | const ele1 = makeCell(div,`${cell.v}`,'box'); 62 | }) 63 | }) 64 | 65 | }) 66 | } 67 | 68 | function makeCell(parent,html,classAdd){ 69 | const ele = document.createElement('div'); 70 | parent.append(ele); 71 | ele.innerHTML = html; 72 | ele.classList.add(classAdd); 73 | return ele; 74 | } 75 | 76 | -------------------------------------------------------------------------------- /Sheet values Send Email via UI click: -------------------------------------------------------------------------------- 1 | function onOpen(){ 2 | const ui = SpreadsheetApp.getUi(); 3 | ui.createMenu('Functions') 4 | .addItem('Email','senderEmail') 5 | .addToUi(); 6 | } 7 | 8 | function senderEmail(){ 9 | const sheet = SpreadsheetApp.getActiveSheet(); 10 | const range = sheet.getActiveRange(); 11 | Logger.log(range.getRow()); 12 | const email = sheet.getRange(range.getRow(),2,1,1).getValue(); 13 | const user = sheet.getRange(range.getRow(),1,1,1).getValue(); 14 | Logger.log(email); 15 | const message = 'Hello ' + user; 16 | const subject = 'Sheet email tester'; 17 | MailApp.sendEmail(email,subject,message); 18 | } 19 | -------------------------------------------------------------------------------- /UI menu script alert prompt: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | SpreadsheetApp.getUi() 3 | .createMenu('Adv') 4 | .addItem('Alert','show1') 5 | .addItem('Prompt','show2') 6 | .addToUi(); 7 | } 8 | 9 | function checker(ui){ 10 | const res = ui.prompt('Your Name Please?',ui.ButtonSet.OK_CANCEL); 11 | const btn = res.getSelectedButton(); 12 | const mes = res.getResponseText(); 13 | if(btn == ui.Button.OK && mes.length >0){ 14 | return 'Welcome, '+mes; 15 | }else{ 16 | return checker(ui); 17 | } 18 | } 19 | 20 | function show2(){ 21 | const ui = SpreadsheetApp.getUi(); 22 | let message = checker(ui); 23 | ui.alert(message); 24 | } 25 | 26 | function show1(){ 27 | const ui = SpreadsheetApp.getUi(); 28 | const res = ui.alert('Ready?',ui.ButtonSet.YES_NO_CANCEL); 29 | Logger.log(res); 30 | let message = ''; 31 | if(res == ui.Button.YES){ 32 | message = 'Was Yes'; 33 | }else if (res == ui.Button.NO){ 34 | message = 'Oh NO!'; 35 | }else if (res == ui.Button.CANCEL){ 36 | message = 'Was Cancelled!'; 37 | }else if (res == ui.Button.CLOSE){ 38 | message = 'Really closed!!!'; 39 | }else{ 40 | message = 'No response'; 41 | } 42 | ui.alert(message); 43 | } 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Upload from Computer to Gdrive: -------------------------------------------------------------------------------- 1 | function doGet(e) { 2 | const html = HtmlService.createTemplateFromFile('index'); 3 | const output = html.evaluate(); 4 | return output; 5 | } 6 | 7 | function doUpload(obj){ 8 | const blob = Utilities.newBlob(Utilities.base64Decode(obj.data),obj.mimeType,obj.fileName); 9 | const id = '1QNw4d-Rq7M0vdtmT7i8lr-ZDExWc8aZD'; 10 | const folder = DriveApp.getFolderById(id); 11 | const file = folder.createFile(blob); 12 | const fileURL = file.getUrl(); 13 | const response = { 14 | 'fileName' : obj.fileName, 15 | 'url' : fileURL, 16 | 'status' :true, 17 | 'data' : JSON.stringify(obj) 18 | } 19 | return response; 20 | } 21 | 22 | 23 | 24 | 25 | 26 | 27 | Uploader V2 28 | 29 | 30 |

Upload your File to Drive

31 | 32 | 33 |
34 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /WebApp Client to Server Side Communications Code Example: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Laurence Svekis

8 | 9 | 10 | 33 | 34 | 35 | 36 | 37 | 38 | function doGet(){ 39 | const html = HtmlService.createHtmlOutputFromFile('output'); 40 | return html; 41 | } 42 | 43 | function findMyUser(){ 44 | return Session.getActiveUser().getEmail(); 45 | } 46 | 47 | function fun1(val){ 48 | const id = '1zhez9FBfGRjs8SRK58SjJ2BTu8Pspud_10h1A_TntCc'; 49 | const ss = SpreadsheetApp.openById(id).getSheetByName('log'); 50 | ss.appendRow([val]); 51 | return val; 52 | } 53 | 54 | -------------------------------------------------------------------------------- /Youtube/Apps Script Sheets Common Question: -------------------------------------------------------------------------------- 1 | function onOpen() { 2 | const ui = SpreadsheetApp.getUi(); 3 | ui.createMenu('adv menu') 4 | .addItem('log','myLog') 5 | .addItem('info','myInfo') 6 | .addItem('email','myEmailer') 7 | .addItem('PDF','myPDF') 8 | .addToUi(); 9 | } 10 | function doGet(e){ 11 | if(e.parameter.id){ 12 | sheetLogger(e.parameter.id); 13 | adder(e.parameter.id); 14 | }else{ 15 | sheetLogger(JSON.stringify(e)); 16 | } 17 | return ContentService.createTextOutput(JSON.stringify(e)); 18 | } 19 | function myPDF(){ 20 | const data = checkSel(); 21 | if(data.sName == 'Users' && data.results){ 22 | createmyPDF(data.results); 23 | sheetLogger('PDF Made '+data.results.first); 24 | }else{ 25 | SpreadsheetApp.getUi().alert('Sorry no Data!'); 26 | } 27 | } 28 | function createmyPDF(user){ 29 | const fid = '1pbtYVjLkrYP_97ON9lgTG8YxYb-a5bgu'; 30 | const docID = '1gTPJ2rV0BPTP1qTr4-jnH7M5kY2JZVTnd40fPtO_SX8'; 31 | const docTemp = DriveApp.getFileById(docID); 32 | const mainfolder = DriveApp.getFolderById(fid); 33 | const docNew = docTemp.makeCopy(mainfolder); 34 | const editNew = DocumentApp.openById(docNew.getId()); 35 | const body = editNew.getBody(); 36 | body.replaceText('{first}',user.first); 37 | body.replaceText('{last}',user.last); 38 | editNew.saveAndClose(); 39 | const myBlob = docNew.getAs(MimeType.PDF); 40 | const newPDF = mainfolder.createFile(myBlob).setName(user.first+user.last); 41 | SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Users').getRange(user.row,6).setValue(newPDF.getUrl()); 42 | if(user.email) sendtoEmail(user,newPDF); 43 | docNew.setTrashed(true); 44 | return newPDF; 45 | } 46 | function sendtoEmail(data,newPDF){ 47 | const userEmail = Session.getActiveUser().getEmail(); 48 | const message = `Complete : ${data.first} ${data.last} Send to email ${data.email}`; 49 | try { 50 | MailApp.sendEmail(userEmail,'PDF Ready',message,{ 51 | attachments:[newPDF] 52 | }) 53 | } catch(e){} 54 | } 55 | function adder(myid){ 56 | const id = '1xPf8wXM0cMO7Sh9U9vKzxCIiWP_IbIzBLkFw2rd7vuQ'; 57 | const sheet = SpreadsheetApp.openById(id).getSheetByName('Users'); 58 | const data = sheet.getDataRange().getValues(); 59 | for(let i=0;i"; 93 | } 94 | function myLog(){ 95 | sheetLogger('Hello World'); 96 | } 97 | function myInfo(){ 98 | const data = checkSel(); 99 | //Logger.log(data); 100 | if(data.sName == 'Users' && data.results){ 101 | const html = HtmlService.createTemplateFromFile('temp'); 102 | html.user = data.results; 103 | const htmlOutput = HtmlService.createHtmlOutput(html.evaluate().getContent()) 104 | .setWidth(250).setHeight(300); 105 | SpreadsheetApp.getUi() 106 | .showModelessDialog(htmlOutput,'Details'); 107 | sheetLogger('info '+data.results.first); 108 | }else{ 109 | SpreadsheetApp.getUi().alert('Sorry no Data!'); 110 | } 111 | } 112 | function checkSel(){ 113 | const ss = SpreadsheetApp.getActive(); 114 | const sheetName = ss.getActiveSheet().getSheetName(); 115 | if(sheetName == 'Users') { 116 | const range = ss.getSelection().getActiveRange(); 117 | if(range.getRow() <= ss.getLastRow()){ 118 | return { 119 | sName:sheetName, 120 | results:getmyUser(range.getRow(),ss.getLastColumn()) 121 | } 122 | } 123 | } 124 | return { 125 | sName : sheetName, 126 | results : null 127 | } 128 | } 129 | function getmyUser(row,cols){ 130 | const vals = SpreadsheetApp.getActive().getActiveSheet().getSheetValues(row,1,1,cols)[0]; 131 | return { 132 | id : vals[0], 133 | first : vals[1], 134 | last : vals[2], 135 | email : vals[3], 136 | row : row 137 | } 138 | } 139 | function sheetLogger(message){ 140 | const id = '1xPf8wXM0cMO7Sh9U9vKzxCIiWP_IbIzBLkFw2rd7vuQ'; 141 | const ss = SpreadsheetApp.openById(id); 142 | let sheetLog = ss.getSheetByName('log'); 143 | if(sheetLog == null){ 144 | sheetLog = ss.insertSheet(); 145 | sheetLog.setName('log'); 146 | sheetLog.appendRow(['Messages','Date']); 147 | } 148 | sheetLog.appendRow([message,new Date()]); 149 | } 150 | -------------------------------------------------------------------------------- /send email notiifications: -------------------------------------------------------------------------------- 1 | function sendEmailNotification() { 2 | var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 3 | var lastRow = sheet.getLastRow(); 4 | 5 | for (var i = 2; i <= lastRow; i++) { 6 | var assignedTo = sheet.getRange(i, 2).getValue(); // Assuming assignedTo column is B 7 | var taskDescription = sheet.getRange(i, 1).getValue(); // Assuming taskDescription column is A 8 | var emailAddress = sheet.getRange(i, 3).getValue(); // Assuming emailAddress column is C 9 | 10 | if (assignedTo !== "" && emailAddress !== "") { 11 | var subject = "Task Assigned: " + taskDescription; 12 | var message = "You have been assigned a new task: " + taskDescription; 13 | MailApp.sendEmail(emailAddress, subject, message); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sheet data as table in doc: -------------------------------------------------------------------------------- 1 | const SHEETID = '1u7vPqjklpmrqcFvq-n8ygU'; 2 | const DOCID = '1yoV_oFO-wY1-cB63hhIrY'; 3 | 4 | function getValues1() { 5 | const ss = SpreadsheetApp.openById(SHEETID); 6 | const sheet = ss.getSheets()[0]; 7 | const range = sheet.getDataRange(); 8 | const data = range.getValues(); 9 | return data; 10 | } 11 | 12 | function createTableDoc(){ 13 | const doc = DocumentApp.create('doc1'); 14 | } 15 | 16 | function updateDoc(){ 17 | const doc =DocumentApp.openById(DOCID); 18 | const body = doc.getBody(); 19 | const cells = getValues1(); 20 | body.appendTable(getValues1()); 21 | //DocumentApp.openById(DOCID).getBody().appendTable(getValues1()); 22 | Logger.log(body); 23 | } 24 | -------------------------------------------------------------------------------- /sheets data API: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sheets API 5 | 6 | 7 |
8 | 24 | 25 | 26 | 27 | 28 | const SHEETID = '1K4kLsAnxxwWoKoZObTrsNSbP0oqbF_-lAxfXKDspKkQ'; 29 | 30 | function doGet(e){ 31 | const ss = SpreadsheetApp.openById(SHEETID); 32 | const sheet = ss.getSheetByName('jokes'); 33 | const rows = sheet.getDataRange().getValues(); 34 | Logger.log(rows); 35 | return outputContent(rows); 36 | } 37 | 38 | function outputContent(data){ 39 | const temp = JSON.stringify({ 40 | status : 'success', 41 | data : data 42 | }) 43 | return ContentService.createTextOutput(temp); 44 | } 45 | -------------------------------------------------------------------------------- /spreadsheet get cell data: -------------------------------------------------------------------------------- 1 | function myFunction() { 2 | const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test'); 3 | const data = ss.getDataRange().getValues(); 4 | data.forEach((rowArr,rowIndex)=>{ 5 | rowArr.forEach((cell,colIndex)=>{ 6 | if(cell == '6'){ 7 | Logger.log(rowIndex); 8 | const range = ss.getRange(rowIndex+1,colIndex+1); 9 | range.setBackground('purple'); 10 | range.setFontColor('white'); 11 | range.setFontSize(19); 12 | Logger.log(range.getValue()); 13 | } 14 | }) 15 | }) 16 | //Logger.log(data); 17 | } 18 | -------------------------------------------------------------------------------- /testing mock ChatGPT: -------------------------------------------------------------------------------- 1 | // Refactored functions with dependency injection 2 | function sendPromptToChatGPT(prompt, fetchFunction) { 3 | // Use fetchFunction instead of UrlFetchApp.fetch 4 | const response = fetchFunction('https://api.openai.com/completions', /* options */); 5 | const json = JSON.parse(response); 6 | const text = json.choices[0].text.trim(); 7 | return text; 8 | } 9 | 10 | function createDocWithResponse(responseText, docApp, driveApp, folderId) { 11 | // Use docApp and driveApp instead of DocumentApp and DriveApp 12 | const doc = docApp.create('ChatGPT Response'); 13 | const body = doc.getBody(); 14 | body.setText(responseText); 15 | const file = driveApp.getFileById(doc.getId()); 16 | driveApp.getFolderById(folderId).addFile(file); 17 | driveApp.getRootFolder().removeFile(file); 18 | return doc.getUrl(); 19 | } 20 | 21 | // Mock functions 22 | function mockFetch(url, options) { 23 | // Simulate a response from the OpenAI API 24 | return JSON.stringify({ 25 | choices: [{ text: 'This is a simulated response' }] 26 | }); 27 | } 28 | 29 | function mockDocumentApp() { 30 | // Simulate the DocumentApp behavior 31 | return { 32 | create: function (name) { 33 | return { 34 | getId: function () { return 'dummyDocId'; }, 35 | getBody: function () { return { setText: function (text) {} }; }, 36 | getUrl: function () { return 'http://dummyDocUrl'; } 37 | }; 38 | } 39 | }; 40 | } 41 | 42 | function mockDriveApp() { 43 | // Simulate the DriveApp behavior 44 | return { 45 | getFileById: function (id) { 46 | return {}; 47 | }, 48 | getFolderById: function (id) { 49 | return { 50 | addFile: function (file) {}, 51 | removeFile: function (file) {} 52 | }; 53 | }, 54 | getRootFolder: function () { 55 | return { 56 | removeFile: function (file) {} 57 | }; 58 | } 59 | }; 60 | } 61 | 62 | // Test function 63 | function testFunctions() { 64 | const dummyPrompt = 'This is a test prompt'; 65 | const dummyFolderId = 'dummyFolderId'; 66 | 67 | const testResponse = sendPromptToChatGPT(dummyPrompt, mockFetch); 68 | console.log('Test response from ChatGPT:', testResponse); 69 | 70 | const testDocUrl = createDocWithResponse('Test response', mockDocumentApp(), mockDriveApp(), dummyFolderId); 71 | console.log('Test document URL:', testDocUrl); 72 | } 73 | 74 | // Run this function to perform the tests 75 | testFunctions(); 76 | 77 | /* 78 | -------------------------------------------------------------------------------- /webapp GET POST: -------------------------------------------------------------------------------- 1 | const ID = '1Cwi4G0sivPHF5rMiw3dRRBTTnr6vQWNSlFB6ls6r4Os'; 2 | const MYOBJ = [ 3 | {first:'Laurence',last:'Svekis'}, 4 | {first:'Test',last:'Svekis'}, 5 | {first:'Jane',last:'Doe'} 6 | ]; 7 | 8 | function doGet(e) { 9 | const data = output(e); 10 | return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON); 11 | } 12 | 13 | function doPost(e) { 14 | const data = output(e); 15 | return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON); 16 | } 17 | 18 | function output(e){ 19 | const data = {}; 20 | if('type' in e.parameter){ 21 | let valID = e.parameter['type']; 22 | if(valID === '1'){ 23 | data.vals = SpreadsheetApp.openById(ID).getSheets()[0].getDataRange().getValues(); 24 | }else if(valID === '2'){ 25 | data.vals = MYOBJ; 26 | }else if(valID === '3'){ 27 | data.vals = e; 28 | }else { 29 | data.vals = {status:'Nothing found'}; 30 | } 31 | } 32 | return data.vals; 33 | } 34 | 35 | 36 | 37 | JavaScript 38 | 39 | 40 | 41 | 42 | 43 |
44 | 45 | 46 | 47 | 48 | const url = 'https://script.google.com/macros/s/AKfycbwtwnU8_hLkHg4_XpRhtjrJM02qfDYNXTWcWFWFSFVYObQXGeQ_kucfU4aPByJfVvQ-FQ/exec'; 49 | const myInput = document.querySelector('input'); 50 | const btn1 = document.querySelector('.btn1'); 51 | const btn2 = document.querySelector('.btn2'); 52 | const results = document.querySelector('.results'); 53 | 54 | btn1.addEventListener('click',(e)=>{ 55 | const val = myInput.value; 56 | const url1 = `${url}?type=${val}`; 57 | fetch(url1) 58 | .then(res => res.json()) 59 | .then(data => { 60 | outputer(data,'GET'); 61 | }) 62 | }) 63 | 64 | btn2.addEventListener('click',(e)=>{ 65 | const url1 = `${url}?type=${myInput.value}`; 66 | const formData = new FormData(); 67 | formData.append('key1','Value1'); 68 | fetch(url1,{ 69 | method : 'POST', 70 | body : formData 71 | }) 72 | .then(res => res.json()) 73 | .then(data => { 74 | outputer(data,'POST'); 75 | }) 76 | }) 77 | 78 | function outputer(vals,val){ 79 | console.log(vals); 80 | results.textContent = JSON.stringify(vals); 81 | results.textContent += JSON.stringify(' Sent Method '+val); 82 | } 83 | 84 | --------------------------------------------------------------------------------