使用Google Apps Script为电子邮件附件命名

3
我有以下G.A.S脚本,可以将Google表格作为PDF附件发送电子邮件。
  var spreadsheet = SpreadsheetApp.getActive();
  var subject = spreadsheet.getRange("U1:U1").getValues();
  var emailTo = spreadsheet.getRange("V1:V1").getValues();
  var message = spreadsheet.getRange("W1:W1").getValues();
  var pdf = DriveApp.getFileById(spreadsheet.getId()).getAs('application/pdf').getBytes();
  var attach = {fileName:subject,content:pdf, mimeType:'application/pdf'};
  MailApp.sendEmail(emailTo, subject, message, {attachments:[attach]});

上述代码工作良好,除了附加到电子邮件消息的文件具有奇怪的名称,例如“[Ljava.lang.Object_@4e63998c”,没有“.pdf”扩展名! 我正在寻找一种在附加到电子邮件之前为pdf文件设置名称的方法。文件名应等于“subject”变量。

提前致谢。 Omid


尝试使用 getBlob 而不是 getBytes - tehhowch
@omid 在使用时不需要调用 getBytes() - tehhowch
@Tanaike 顺便问一下,我能否通过 Telegram 将这个 PDF 文件发送给特定的人而不是通过电子邮件呢? - Omid
@tehhowch 当我删除 getBytes() 后,我会收到这个错误消息:“附件内容无法识别为字符串或二进制文件。” - Omid
我认为@tehhowch可能会建议您在脚本中从“var pdf = ...”和“var attach = ...”修改为“var attach = DriveApp.getFileById(spreadsheet.getId()).getBlob().setName(subject[0][0]);”。致tehhowch。如果我误解了您的评论,我很抱歉。 - Tanaike
显示剩余2条评论
2个回答

1

getValues() 检索到的值是二维数组。我认为文件名成为这样的字符串是因为该数组被用作文件名。请从数组中检索元素并重试。所以,您能否按照以下方式进行修改?

转化后:

getValues() 检索到的值是一个二维数组。我认为文件名变成了这样的字符串是因为该数组被用作文件名。请从数组中获取元素并尝试再次操作。所以,请按照以下方式进行修改:

var attach = {fileName:subject,content:pdf, mimeType:'application/pdf'};

收件人:

var attach = {fileName:subject[0][0],content:pdf, mimeType:'application/pdf'};

你可以使用以下修改。在这种情况下,getValue() 可以从单元格“U1”中检索值的字符串形式。

原文:

var subject = spreadsheet.getRange("U1:U1").getValues();

收件人:

var subject = spreadsheet.getRange("U1:U1").getValue();

参考资料:

如果这不是您想要的,请告诉我。我会考虑其他解决方案。


哇!太棒了!当我插入[0][0]时,它解决了问题。然而,将getValues()更改为getValue()会导致文件名仅由一个字符组成,该字符是指定变量值的第一个字符。顺便说一下,非常感谢。太棒了 :) - Omid
我非常感谢你清晰详细的回答,对像我这样的新手非常有用,我可以轻松地应用它。非常感谢你,朋友 :) - Omid
还有一个问题。附件的PDF文件大约有13页,但只有前几页包含信息,其他页面都是空白的。有没有办法仅保留包含数据的部分并裁剪空白页?! - Omid
@Omid 谢谢您的回复。subject[0][0]中的[0][0]表示通过getValues()检索到的二维数组中元素的地址。在您的情况下,“U1:U1”中的值只有一个。因此,地址是[0][0]。您可以在https://dev59.com/8nNA5IYBdhLWcg3wbNM4上查看详细信息。 - Tanaike
亲爱的@Tanaike,我在这里发布了我的问题 https://stackoverflow.com/q/50941647/9863856 - Omid
显示剩余8条评论

0

我有点晚了,但解决这个问题的另一种方法可能是:

var spreadsheet = SpreadsheetApp.getActive();
var subject = spreadsheet.getRange("U1:U1").getValues();
var emailTo = spreadsheet.getRange("V1:V1").getValues();
var message = spreadsheet.getRange("W1:W1").getValues();

var pdf = DriveApp.getFileById(spreadsheet.getId())
                  .getAs('application/pdf')
                  .getBlob()
                  .setName(subject);

MailApp.sendEmail(emailTo, subject, message, {attachments:[pdf]});

Blob类有一个setName方法https://developers.google.com/apps-script/reference/base/blob#setName(String), 可以链接到Blob对象(这是getBlob()的结果)

之后,您只需要将Blob对象添加到attachments数组中的MailApp.sendEmail函数中即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接