email - 用于通过电子邮件发送事件电子表格的 Google Apps 脚本

标签 email google-apps-script range google-sheets

我在网上找到了一个脚本,它可以获取当前工作表,将其复制到临时的新电子表格中,将其转换为 PDF 并通过电子邮件发送。我能够让它工作,但尝试将其设置为仅发送特定范围。尝试了一下,但无论如何我都不是一个好的编码员。或者,我也有兴趣弄清楚如何让它适合横向的 1 页 PDF,在没有网格线的情况下进行转换(我的在线研究表明这是不可能的?),甚至以 XLS 形式发送。

// Simple function to send Weekly Status Sheets to contacts listed on the "Contacts" sheet in the MPD.

// Load a menu item called "Project Admin" with a submenu item called "Send Status"
// Running this, sends the currently open sheet, as a PDF attachment
function onOpen() {
  var submenu = [{name:"Send Status", functionName:"exportSomeSheets"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Project Admin', submenu);  
}

function exportSomeSheets() {
  // Set the Active Spreadsheet so we don't forget
  var originalSpreadsheet = SpreadsheetApp.getActive();

  // Set the message to attach to the email.
  var message = "Please see attached"; // Could make it a pop-up perhaps, but out of wine today

  // Get Project Name from Cell A1
  var projectname = originalSpreadsheet.getRange("A1:A1").getValues(); 
  // Get Reporting Period from Cell B3
  var period = originalSpreadsheet.getRange("B3:B3").getValues(); 
  // Construct the Subject Line
  var subject = projectname + " - Weekly Status Sheet - " + period;


  // Get contact details from "Contacts" sheet and construct To: Header
  // Would be nice to include "Name" as well, to make contacts look prettier, one day.
  var contacts = originalSpreadsheet.getSheetByName("Contacts");
  var numRows = contacts.getLastRow();
  var emailTo = contacts.getRange(2, 2, numRows, 1).getValues();

  // Google scripts can't export just one Sheet from a Spreadsheet
  // So we have this disgusting hack

  // Create a new Spreadsheet and copy the current sheet into it.
  var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var projectname = SpreadsheetApp.getActiveSpreadsheet();
  sheet = originalSpreadsheet.getActiveSheet();
  sheet.copyTo(newSpreadsheet);

  // Find and delete the default "Sheet 1", after the copy to avoid triggering an apocalypse
  newSpreadsheet.getSheetByName('Sheet1').activate();
  newSpreadsheet.deleteActiveSheet();

  // Make zee PDF, currently called "Weekly status.pdf"
  // When I'm smart, filename will include a date and project name
  var pdf = DocsList.getFileById(newSpreadsheet.getId()).getAs('application/pdf').getBytes();
  var attach = {fileName:'Weekly Status.pdf',content:pdf, mimeType:'application/pdf'};

  // Send the freshly constructed email 
  MailApp.sendEmail(emailTo, subject, message, {attachments:[attach]});

  // Delete the wasted sheet we created, so our Drive stays tidy.
  DocsList.getFileById(newSpreadsheet.getId()).setTrashed(true);  
}

最佳答案

要发送单张纸,您可以在发送之前隐藏所有其他纸。

var sheet_to_send = 'Sheet1';
//-----------------------------
var as = SpreadsheetApp.getActiveSpreadsheet();
var sheets = as.getSheets();
for(var i in sheets){
    if (sheets[i].getName()!=sheet_to_send){
        sheets[i].hideSheet();
    }
}
MailApp.sendEmail(email_to, email_subject, email_body, {attachments: SpreadsheetApp.getActiveSpreadsheet()});
for(var i in sheets){
    if (sheets[i].getName()!=sheet_to_send){
        sheets[i].showSheet();
    }
}

如果您有更多工作表要发送,您可以使用 JavaScript 对象过滤它们:

var sheets_to_send = {'Sheet1':1, 'Sheet3': 1};
...
// replace 
if (sheets[i].getName()!=sheet_to_send)
// by
if (!(sheets[i].getName() in sheet_to_send))

关于email - 用于通过电子邮件发送事件电子表格的 Google Apps 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16597322/

相关文章:

jQuery-UI 日期和时间范围选择器

html - PHP消息中的随机空格

python - 确定范围是否与现有范围重叠,如果不重叠则添加范围

email - 如何使用 JSOUP 解析 [email protected] 数据

google-apps-script - 如何将文档添加到文件夹

javascript - Google 表格/Apps 脚本将公式复制到新行

javascript - Google 网站上的 Apps Script Gadget 开始抛出 CORS 错误

excel - 使用 VBA 选择和复制多个范围

iphone - 我正在寻找有关如何检索适用于 MacOS 和 iOS 的电子邮件的 Objective C 示例

c# - 运行 c# 编译代码时的 Windows 调度程序功能