【问题标题】:GmailApp.sendEmail not working with G Suite AccountGmailApp.sendEmail 不适用于 G Suite 帐户
【发布时间】:2020-10-07 18:41:47
【问题描述】:

我正在尝试使用 GmailApp.sendEmail 通过电子邮件发送 Google 表格的 PDF。该脚本在发件人拥有@gmail.com 帐户时有效,但由于某种原因,GSuite 帐户(不是@gmail.com)发送的 HTML 文档不包含工作表的 PDF。

这是我的代码的 sn-p,目前我只在这部分使用 GmailApp..。

function printForward() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[3];
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
  var ssname = ss.getName();
  var length = ssname.length;
  var date = ssname.substring(0,length-15);
  const body = "All, <br><br>Attached is the invoice for the week of "+ date+"."+"<br><br> Thank you, <br> Elizabeth Moscoso";
  var fnumber = 2;
  sendSpreadsheetToPdf(3, shName, ss.getRange('Constants!T5').getValue(),"Invoices "+date, body, date, fnumber);
}

function printMidwest(){
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sh = ss.getSheets()[5];
 var shName = sh.getName();
 var ssname = ss.getName();
 var length = ssname.length;
 var date = ssname.substring(0, length-15);
 const body = "All, <br><br>Attached is the invoice for the week of "+ date+"."+"<br><br> Thank you, <br> Elizabeth Moscoso";
 var mnumber = 1;
 sendSpreadsheetToPdf(5, shName, ss.getRange('Constants!T5').getValue(), "Invoices "+date, body, date, mnumber);
}


function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody, invcdate, foldNum) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;
  var url_base = spreadsheet.getUrl().replace(/edit$/,'');

  if(foldNum == 2){var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 
      // following parameters are optional...
      + '&size=A4'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw = true' // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page
      }
  if(foldNum == 1)
  {var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf
      
      + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))
      // following parameters are optional...
      + '&size=A4'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw = true' // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page
      }


  var options = {
    headers: {method:"GET",
      'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(),
    }
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName+" Invoice "+ invcdate+ '.pdf');
 
  var mailOptions = {};
  var attachmentArray = [];
  
  if(blob){
  attachmentArray.push(blob);
  mailOptions.attachments = attachmentArray;
  }
 
  if(htmlbody){
  mailOptions.htmlBody = htmlbody;
  }
  
  if(email){
  GmailApp.sendEmail(email,subject,"",mailOptions);
  }
 
  //save PDF
  const nameFile = "Forward " + invcdate + ".pdf";
  if(foldNum == 2){
  var forwardFolder = DriveApp.getFolderById("1-n7O87J0zN7ZnOtErhcJR_JDbkrjSyj8");
  forwardFolder.createFile(blob);}
  if(foldNum == 1){
  var midwestFolder = DriveApp.getFolderById("17cQrFnAzy3B6jmwZB5-Osa6G7oC3YOLw")
  midwestFolder.createFile(blob);
  }

}


我不确定为什么 GSuite 帐户无法发送电子邮件/pdf。另外,如果我完全取出发送电子邮件的部分并让 GSuite 帐户只保存 PDF,它会提供相同的 HTML 文件。

【问题讨论】:

  • 执行记录;你看到任何错误吗?你能放一些Logger.log() 行来检查email 是否有数据吗?
  • 尝试为GmailApp.sendEmail()body 参数使用除空白字符串之外的其他内容。不知道为什么这很重要,只是一个想法。
  • 确保您确实输入了这个 if 语句:if(email){ GmailApp.sendEmail(email,subject,"",mailOptions); }
  • 阅读最后一段时,我不太确定标题是否正确。
  • 嗨!如果接收方是 G Suite 帐户,您会收到什么?只是一个空的 HTML 吗?您的 Apps 脚本代码是否有任何错误?

标签: google-apps-script google-drive-api google-workspace urlfetch


【解决方案1】:

我刚刚自己尝试过,类似这样的 URL 应该导出 PDF(假设适当的 oAuth2 范围)。 PDF 导出需要范围 https://www.googleapis.com/auth/spreadsheets.readonly

var url = 'https://docs.google.com/document/d/' + id + '/export?format=pdf'

这显然会导出整个文档,但以后仍然可以缩小范围。


您也可以尝试使用MailApp 类而不是GMailApp 类,这样在对脚本进行更改时不会经常触发重新授权请求(这可能是一个因素)。除非需要访问用户的 GMail 邮箱,否则没有任何理由使用GMailApp

oAuth2 授权范围也有所不同; GMailApp 类使用了相当广泛的范围:

https://mail.google.com/

虽然MailApp 类使用了一个非常具体的范围:

https://www.googleapis.com/auth/script.send_mail

从问题中也不清楚,如果您导入了“OAuth2 for Apps Script”库;它的 ID 是:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

【讨论】:

  • 我会尝试使用 GmailApp
  • 嗯?你已经使用了那个。问题甚至可能没有让 PDF 附加。而且我还想知道参数exportFormat=pdf,这似乎是多余的......当具有适当的范围时,这通常应该可以工作(一般来说,您的脚本可能有点过时)。我建议从导出任何 PDF 所需的最少参数重新开始,然后添加更多参数。
  • 我发现使用 G Suite 帐户时 url_base 返回的内容有所不同。更新它会使 PDF 打印正确。感谢您的帮助。
  • 没问题;请考虑接受我的回答……即使我无法说出确切的原因;提供一个已知有效的 URL 可能是主要线索。
猜你喜欢
  • 2021-06-10
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2019-07-15
相关资源
最近更新 更多