2021年3月29日星期一

How to avoid requesting OAuth API verification to send emails using Google Scripts

This question comes from a previous one almost solved: Save a Google Form as PDF on a Drive's folder using Google Scripts

Introduction

Perhaps this is a technical question and I am not programmer, so if possible I want a step-by-step answer so I can fully understand it.

The steps and purpose of the code are explained here: Hacking it: Generate PDFs from Google Forms.

The code is posted on the link but I post it here anyways:

function onSubmit(e) {    const rg = e.range;    const sh = rg.getSheet();        //Get all the form submitted data    //Note: This data is dependent on the headers. If headers, are changed update these as well.    const cName = e.namedValues['Client Name'][0];    const cEmail = e.namedValues['Client Email'][0];    const cAddress = e.namedValues['Client Address'][0];    const cMobile = e.namedValues['Client Mobile'][0];    const sendCopy = e.namedValues['Send client a copy?'][0];    const paymentType = e.namedValues['What is your agreed upon payment schedule?'][0];    const fixedCost = e.namedValues['What was your agreed upon cost for the project?'][0];    const hourlyRate = e.namedValues['Hourly Rate'][0];    const manHours = e.namedValues['Total man hours'][0];    const services = e.namedValues['Select the services'][0];        //Consequential Data    const tax = 18.5    var subtotal = 0;    var taxAmt = 0;    var payableAmt = 0;            //if the user has selected hourly payment model    //Note: Be careful that the responses match the elements on the actual form    switch (paymentType ){      case 'Hourly Rate':        subtotal = hourlyRate*manHours;        taxAmt = subtotal * (tax/100);        payableAmt = +subtotal + +taxAmt;        break;      case 'Fixed Cost':        subtotal = fixedCost;        taxAmt = fixedCost * (tax/100)        payableAmt = +fixedCost + +taxAmt;        break;                }        const invoiceID = 'IN' + Math.random().toString().substr(2, 9);    var formattedDate = Utilities.formatDate(new Date(), "IST", "dd-MMM-yyyy");        //Set the consequential data in the columns of the spreadsheet for record keeping    //Note: These variable are dependent on the sheet's columns so if that changes, please update.    const row = rg.getRow();        const payableAmtCol = 2; //B    const invoiceIDCol = 3; //C        sh.getRange(row,payableAmtCol).setValue(payableAmt);    sh.getRange(row,invoiceIDCol).setValue(invoiceID);             //Build a new invoice from the file    //Folder and file IDs    const invoiceFolderID = '<invoice-folder-id>';    const invoiceFolder = DriveApp.getFolderById(invoiceFolderID);        const templateFileID = '<template-id>';    const newFilename = 'Invoice_' + invoiceID;        //Make a copy of the template file    const newInvoiceFileID = DriveApp.getFileById(templateFileID).makeCopy(newFilename, invoiceFolder).getId();;        //Get the invoice body into a variable    var document = DocumentApp.openById(newInvoiceFileID);    var body = document.getBody();        //Replace all the  text in the invoice body    body.replaceText('', invoiceID);    body.replaceText('', formattedDate);    body.replaceText('', cName);    body.replaceText('', cAddress);    body.replaceText('', cMobile);    body.replaceText('', cEmail);    body.replaceText('', services.split(', ').join('\n'));        body.replaceText('', subtotal);    body.replaceText('', taxAmt);    body.replaceText('', payableAmt);        //In the case of hourly rate payment type, let's add an additional message giving the rate and the man hours.    if(paymentType.includes('Hourly Rate')){       //It should look something like this on the invoice       //Hourly Rate       //Rate of Rs.1200/hour       //Completed 50 man hours       const message = paymentType + '\nRate of Rs.' + hourlyRate + '/hour\nCompleted ' + manHours + ' man hours';       body.replaceText('', message);    } else {      body.replaceText('', paymentType);    }        document.saveAndClose();        /* This is not useful for me    //If you have selected to directly send it via email    if(sendCopy.includes('Yes')){      //send email with the file    var attachment = DriveApp.getFileById(newInvoiceFileID);      GmailApp.sendEmail(cEmail, '<subject>,                        '<body>',                        {attachments: [attachment.getAs(MimeType.PDF)],                        from:'<your-email>@gmail.com'});    }    */      }  

In the post, the author shows a way to send an Email to the client, which is what I want for my project.

Actual problem

However, that portion of code is obsolete or the author has completed a verification process before she publishes her app because I have to request an OAuth API verification because of the sendEmail command. As I researched, it takes time and tools that I am completely unaware of (I'm not programmer).

Thus, I ask if there is an easy way (not requesting a verification process) to send a copy of the generated document to the client when he press on "Send" button of Google Form based on the code I posted.

The code works fine, it creates a copy of the document based on a template to a folder of my Drive, but I want to automate the sending of emails so that customers get a copy of the document that I have. I don't want to send any other information like spam etc.

https://stackoverflow.com/questions/66863526/how-to-avoid-requesting-oauth-api-verification-to-send-emails-using-google-scrip March 30, 2021 at 09:06AM

没有评论:

发表评论