首页 > 解决方案 > 创建未隐藏工作表 Google Script 的 PDF

问题描述

我为谷歌表格创建了一个简单的电子邮件脚本。我需要它来附加活动文件的 PDF,但只有 3 张(3 张未隐藏的表格)。我已经尝试了几件事,但似乎没有任何效果,老实说,我不是谷歌脚本的专家,所以我可能遗漏了一些明显的东西。以下是我的代码:

function sendEmails() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Email');
  var startRow = 2; // First row of data to process
  var numRows = 1; // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, 3);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i in data) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = row[1]; // Second column
    var subject = row[2];
    var file= SpreadsheetApp.getActive();
    MailApp.sendEmail(emailAddress, subject, message,{cc:"example@gmail.com",attachments:[file.getAs(MimeType.PDF)]});
  }
}

它所做的是将整个电子表格附加为 PDF,这对我没有帮助,因为 PDF 中有很多我不需要的隐藏工作表。请帮我!!谢谢!

标签: google-apps-scriptgoogle-sheets

解决方案


该功能将向电子邮件表中的收件人发送电子邮件,其中还包含主题和消息。它还使用 incl 数组中的工作表创建当前电子表格的 PDF。发送电子邮件后,它会将工作表返回到其原始可见性状态。

function emailAsPDF() {
  var ss=SpreadsheetApp.getActive();
  var incl=['Sheet2','Emails'];
  var pdfFolderId="Folder Id";
  var folder=DriveApp.getFolderById(pdfFolderId);
  var sObj={shA:[]};
  var shts=ss.getSheets();
  shts.forEach(function(sh,i){
    sObj.shA.push(sh.getName());
    if(sh.isSheetHidden()) {
      sObj[sh.getName()]='hide';
    }else{
      sObj[sh.getName()]='show';
    }
    if(incl.indexOf(sh.getName())!=-1) {
      sh.showSheet();
    }else{
      sh.hideSheet();
    }
  });
  var file=folder.createFile(ss.getBlob()).setName(ss.getName()).getAs(MimeType.PDF);
  var sh=ss.getSheetByName('Emails');
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
  var hObj={};
  hA.forEach(function(e,i){if(e){hObj[e]=i;}})
  var vA=rg.getValues();
  vA.forEach(function(r,i){
    var recipient=r[hObj.recipient];
    var subject=r[hObj.subject];
    var message=r[hObj.message];
    GmailApp.sendEmail(recipient, subject, message, {attachments:[file]})
  })
  sObj.shA.forEach(function(name,i){
    if(sObj[name]=='hide') {
      ss.getSheetByName(name).hideSheet();
    }else{
      ss.getSheetByName(name).showSheet();
    }
  });
}

这是我的电子邮件表的图像:

在此处输入图像描述

我知道...这很简单,但是您可以根据需要对其进行改进。


推荐阅读