【问题标题】:Sending only one sheet or active sheet as pdf via email通过电子邮件仅以 pdf 格式发送一张工作表或活动工作表
【发布时间】:2021-04-21 16:05:04
【问题描述】:

您好,我一直在尝试编写我的第一个脚本,以仅从我的一个 Google 文档中发送一张工作表,但每次我最终都发送了所有工作表。该文档每天都有一个主页,其中我有电子邮件列表,然后是 7 张称为星期一、星期二等的表格

这是我使用的代码 - 你能帮忙吗?

function emailActivesheetAsPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();

  const ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1_3VpJaFliJVYt1JL3cLSKw2ftsmsLeDjznHJ66-wq9w/edit");

  const value = ss.getSheetByName("Daily").getRange("B5").getValue();
  const email = value.toString();

  const subject = 'Yesterday Handover';

  const body = "Please find attached yesterday handover";

  const url = 'https://docs.google.com/spreadsheets/d/1_3VpJaFliJVYt1JL3cLSKw2ftsmsLeDjznHJ66-wq9w/export?';

  const exportOptions =
    'exportFormat=pdf&format=pdf'
    '&size=legal'
    '&portrait=true'
    '&fitw=false'
    '&sheetnames=false&printtitle=false'
    '&pagenumbers=false&gridlines=false'
    '&fzr=false'
    '&gid=1263775066';
 
  var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
  
  var response = UrlFetchApp.fetch(url+exportOptions, params).getBlob();
  
    GmailApp.sendEmail(email, subject, body, {
      htmlBody: body,
      attachments: [{
            fileName: "Handover" + ".pdf",
            content: response.getBytes(),
            mimeType: "application/pdf"
        }]
    });
}

【问题讨论】:

    标签: javascript email pdf google-apps-script google-sheets


    【解决方案1】:

    说明/问题:

    • 您忘记连接exportOptions 变量中的选项,因此exportOptions 仅获取&size=legal 的值并忽略其余参数,包括您指定工作表ID 的gid。一种解决方案是通过+ 连接选项。

    • 我还改进了您的代码,使其更加灵活。例如,不是在代码中通过其gid 定义工作表,而是通过变量sheetToPrint 中的名称来定义它,然后GAS 将获得其gid 并将其用作导出选项pdf。

    解决方案:

    function emailActivesheetAsPDF() {
      const sheetToPrint = "Daily"; // name of the sheet to print
      const ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1_3VpJaFliJVYt1JL3cLSKw2ftsmsLeDjznHJ66-wq9w/edit");
      const ssID = ss.getId();
      const email = ss.getSheetByName("Daily").getRange("B5").getValue();
      const subject = 'Yesterday Handover';
      const body = "Please find attached yesterday handover";
      const shID = ss.getSheetByName(sheetToPrint).getSheetId();
      const url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=pdf&id="+ssID;
      const exportOptions =
        '&size=legal'+
        '&portrait=true'+
        '&fitw=false'+
        '&sheetnames=false&printtitle=false'+
        '&pagenumbers=false&gridlines=false'+
        '&fzr=false'+
        '&gid='+shID; 
      var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
      
      var response = UrlFetchApp.fetch(url+exportOptions, params).getBlob();
      
        GmailApp.sendEmail(email, subject, body, {
          htmlBody: body,
          attachments: [{
                fileName: "Handover" + ".pdf",
                content: response.getBytes(),
                mimeType: "application/pdf"
            }]
        });
    }
    

    【讨论】:

    • 这太棒了 - 谢谢。有没有办法确保 PDF 被发送到适合一页,目前它超过 3 页。很抱歉,这很新:)谢谢
    • 我明白了。我不得不将'&fitw=false 更改为'&fitw=true 谢谢你的帮助。
    • 嗨马里奥 - 他最后没有工作,因为我有 7 个不同的标签,我想每天发送一个不同的 - 但我尝试为每个标签创建 7 个不同的脚本,以便我可以每天运行,但是即使我更改了工作表名称,它也会继续发送相同的消息...您能建议我该怎么做吗?谢谢
    • 只是好奇你有这个方法的参考还是你自己想出来的?我从未见过带有类似对象的附件,我想了解更多关于 fetchapp 并使用它来转换文件的信息。我只在 github 和 SO 上看到了一些参考资料,但我在文档中找不到任何参考资料。谢谢。很抱歉打扰您。
    • @Cooper 很遗憾,我没有官方参考资料,我认为它不存在。我还找到了一个 GitHub 源代码,其中包含您可以选择的所有选项。
    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多