2013-05-16 76 views
2

我在线发现了一个脚本,它将当前表单复制到临时新电子表格,将其转换为PDF并通过电子邮件发送给它。我能够得到它的工作,但试图设置它,以便它只发送一定范围。试图玩一下,但我不是一个很好的编码器。或者,我也有兴趣了解如何使它适合横向1页的PDF格式,无网格转换(我的在线研究显示这不可能?),甚至可以作为XLS发送。Google Apps脚本通过电子邮件发送活动电子表格

// 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); 
} 

回答

0

为了拆分电子表格,你必须首先将部分复制到一个临时表,然后复制成片新的电子表格。

下面是我的代码,用于将您的“创建电子表格...”替换为删除新电子表格Sheet1的位置。

//variables firstRow & lastRow define the part of the sheet to copy 
    //create new spreadsheet 
    var newSpreadsheet = SpreadsheetApp.create('Spreadsheet to export'); 
    //create temporary sheet to copy to new spreadsheet 
    var tempSheet = originalSpreadsheet.insertSheet(); 
    //if header copy it 
    if (sheet.getFrozenRows() > 0) 
    { 
    dataSheet.getRange(1, 1, sheet.getFrozenRows()).copyTo(tempSheet.getRange(1,1)); 
    } 
    //copy relevant data to temporary sheet 
    dataSheet.getRange(firstRow, 1, lastRow - firstRow + 1).copyTo(tempSheet.getRange(sheet.getFrozenRows() + 1, 1)); 
    //copy temp sheet to new spreadsheet 
    tempSheet.copyTo(newSpreadsheet); 

    //delete Sheet1 in new spreadsheet 
    newSpreadsheet.getSheetByName('Sheet1').activate(); 
    newSpreadsheet.deleteActiveSheet(); 

    //delete temp sheet 
    originalSpreadsheet.setActiveSheet(tempSheet); 
    originalSpreadsheet.deleteActiveSheet(); 
0

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

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)) 
1

我使用这个代码,以pdf格式自动发送一个谷歌电子表格的电子邮件。它工作正常,但我需要通过删除网格线并设置显示A4来自定义pdf。有没有办法?谢谢

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:"Invia", functionName:"exportSomeSheets"}]; 
SpreadsheetApp.getActiveSpreadsheet().addMenu('Invia PDF', 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 = "Messaggio email"; 
// Get Project Name from Cell A1 
var projectname = originalSpreadsheet.getRange("A1:A1").getValues(); 
// Get Reporting Period from Cell A2 
var period = originalSpreadsheet.getRange("A2:A2").getValues(); 
// Construct the Subject Line 
var subject = projectname; 


// 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 emailTo = originalSpreadsheet.getRange("A3:A3").getValues(); 


// 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); 

var aliases = GmailApp.getAliases() 
Logger.log(aliases); 
Logger.log(aliases[2]); //returns the alias located at position 0 of the aliases array 


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

// Send the freshly constructed email 
GmailApp.sendEmail(emailTo, subject, message, {'from': aliases[2], attachments:[attach]}); 

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