微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免请求 OAuth API 验证以使用 Google Scripts 发送电子邮件

如何解决如何避免请求 OAuth API 验证以使用 Google Scripts 发送电子邮件

这个问题来自上一个几乎已经解决的问题:Save a Google Form as PDF on a Drive's folder using Google Scripts

简介

也许这是一个技术问题,我不是程序员,所以如果可能的话,我想要一个分步的答案,以便我能够完全理解它。

代码的步骤和目的解释如下:Hacking it: Generate PDFs from Google Forms

代码已发布在链接上,但我还是将其发布在这里

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('{{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,'<subject>,'<body>',{attachments: [attachment.getAs(MimeType.PDF)],from:'<your-email>@gmail.com'});
  }
  */
  
}

在帖子中,作者展示了一种向客户端发送电子邮件方法,这正是我想要的项目。

实际问题

但是,该部分代码已过时,或者作者在发布应用之前已完成验证过程,因为 sendEmail 命令导致我必须请求 OAuth API 验证。根据我的研究,这需要我完全不知道的时间和工具(我不是程序员)。

因此,我问是否有一种简单的方法(没有附加组件并避免请求验证过程)在客户按下 Google 表单的“发送”按钮时将生成的文档的副本发送给他基于我发布的代码

代码运行良好,它根据模板创建了一份文档副本到我的云端硬盘文件夹中,但我想自动发送电子邮件,以便客户获得我拥有的文档副本。我不想发送任何其他信息,如垃圾邮件等。

EDIT 这是我在 appsscript.json 中的内容

{
  "timeZone": "America/New_York","dependencies": {
  },"exceptionLogging": "STACKDRIVER","runtimeVersion": "V8"
}

解决方法

这是我的一个 oauthscope 的样子:

"oauthScopes": [
    "https://mail.google.com/","https://www.google.com/m8/feeds","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/script.external_request","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/script.container.ui","https://www.googleapis.com/auth/calendar","https://www.googleapis.com/auth/gmail.send","https://www.googleapis.com/auth/script.send_mail","https://www.googleapis.com/auth/drive","https://www.googleapis.com/auth/presentations","https://www.googleapis.com/auth/cloud-platform","https://www.googleapis.com/auth/documents","https://www.googleapis.com/auth/script.projects.readonly","https://sites.google.com/feeds","https://www.googleapis.com/auth/drive.activity","https://www.googleapis.com/auth/forms","https://www.googleapis.com/auth/script.projects"
  ],

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。