title: How to avoid requesting OAuth API verification to send emails using Google Scripts
body: <p><em>This question comes from a previous one almost solved: <a href="https://stackoverflow.com/q/66862593/11617040">Save a Google Form as PDF on a Drive's folder using Google Scripts</a></em></p>
  <h2>Introduction</h2>
  <p>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.</p>
  <p>The steps and purpose of the code are explained here: <a href="https://medium.com/swlh/hacking-it-generate-pdfs-from-google-forms-3ca4fcc5a0aa" rel="nofollow noreferrer">Hacking it: Generate PDFs from Google Forms</a>.</p>
  <p>The code is posted on the link but I post it here anyways:</p>
  <pre><code>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(), &quot;IST&quot;, &quot;dd-MMM-yyyy&quot;);
    
    //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 = '&lt;invoice-folder-id&gt;';
    const invoiceFolder = DriveApp.getFolderById(invoiceFolderID);
    
    const templateFileID = '&lt;template-id&gt;';
    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('{{Invoice num}}', invoiceID);
    body.replaceText('{{Date}}', formattedDate);
    body.replaceText('{{Client Name}}', cName);
    body.replaceText('{{Client Address}}', cAddress);
    body.replaceText('{{Client Mobile}}', cMobile);
    body.replaceText('{{Client Email}}', cEmail);
    body.replaceText('{{Services}}', services.split(', ').join('\n'));
    
    body.replaceText('{{Subtotal}}', subtotal);
    body.replaceText('{{Tax Value}}', taxAmt);
    body.replaceText('{{Total}}', 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('{{Payment Type}}', message);
    } else {
      body.replaceText('{{Payment Type}}', 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, '&lt;subject&gt;, 
                       '&lt;body&gt;', 
                       {attachments: [attachment.getAs(MimeType.PDF)],
                        from:'&lt;your-email&gt;@gmail.com'});
    }
    */
    
  }
  </code></pre>
  <p>In the post, the author shows a way to send an Email to the client, which is what I want for my project.</p>
  <h2>Actual problem</h2>
  <p>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 <code>sendEmail</code> command. As I researched, it takes time and tools that I am completely unaware of (I'm not programmer).</p>
  <p>Thus, I ask <strong>if there is an easy way (without add-ons and avoid requesting a verification process) to send a copy of the generated document to the client when he press on &quot;Send&quot; button of Google Form based on the code I posted</strong>.</p>
  <p>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.</p>
  <p><em>EDIT</em> This is the content I have inside <code>appsscript.json</code>:</p>
  <pre><code>{
    &quot;timeZone&quot;: &quot;America/New_York&quot;,
    &quot;dependencies&quot;: {
    },
    &quot;exceptionLogging&quot;: &quot;STACKDRIVER&quot;,
    &quot;runtimeVersion&quot;: &quot;V8&quot;
  }
  </code></pre>