如何 select 特定 google sheet 并附加为 PDF 以使用 MailApp 发送电子邮件
How to select a specific google sheet and attach as a PDF for sending email using MailApp
我正尝试从传播sheet中select一个特定的sheet并在发送给收件人之前将其作为PDF附加到电子邮件中。
现在,下面的代码可以工作,但它是一种使用 for 循环和 if-else 来消除报告中所有其他不需要的 sheet 的变通方法。此代码还会关闭我的活动 sheet 并重新打开
我的主要问题是在附件中获取特定的 sheet,这样我就不必使用 for 循环
非常感谢任何帮助! :)
function sendReport() {
var sheetName="Report";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++)
if (sheets[i].getSheetName() !== sheetName) {
sheets[i].showSheet();
}
var message = {
to: "example@gmail.com",
subject: "ICT Online Helpdesk Report",
body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
name: "ICT Helpdesk",
attachments: [ ss.getAs(MimeType.PDF).setName("Monthly Ticket report")],
}
MailApp.sendEmail(message);
for (var i = 15; i < sheets.length; i++) {
sheets[i].showSheet()
}
}
我不明白你为什么说:“下面的代码有效”。它以 PDF 格式发送所有 sheet。
如果您只需要发送一个 sheet,您必须将 sheet 复制到一个新的 Spreadsheet 中并发送新的 Spreadsheet.
可能您需要这样的东西:
function sendReport() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // current spreadsheet
var sheet = ss.getSheetByName('Report'); // get the sheet 'Report'
var new_ss = SpreadsheetApp.create('Monthly Ticket report'); // create a new spreadsheet
sheet.copyTo(new_ss); // copy the 'Report' to the new spreadsheet
new_ss.deleteSheet(new_ss.getSheets()[0]); // remove the empty first sheet
var message = {
to: "example@mail.com",
subject: "ICT Online Helpdesk Report",
body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
name: "ICT Helpdesk",
attachments: [ new_ss.getAs(MimeType.PDF)] // send the new spreadsheet as PDF
}
MailApp.sendEmail(message);
DriveApp.getFileById(new_ss.getId()).setTrashed(true); // delete the new spreadsheet
}
如果您在复制的 sheet 上有图表和单元格引用,则在发送之前需要另一种算法。
您必须复制整个传播sheet(不仅仅是一个sheet),将sheet 'Report'上的所有引用转换为纯文本并删除sheet 的其余部分。
代码如下:
function sendReport() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // current spreadsheet
var file = DriveApp.getFileById(ss.getId()).makeCopy(); // copy of current spreadsheet
file.setName('Monthly Ticket report'); // rename the copy
var new_ss = SpreadsheetApp.openById(file.getId()); // open the copy
// convert all references into a plain text
var range = new_ss.getSheetByName('Report').getDataRange();
range.setValues(range.getDisplayValues());
// get all sheets but 'Report'
var sheets_to_remove = new_ss.getSheets().filter(x => x.getName() != 'Report');
sheets_to_remove.forEach(x => new_ss.deleteSheet(x)); // remove them
var message = {
to: "example@gmail.com",
subject: "ICT Online Helpdesk Report",
body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
name: "ICT Helpdesk",
attachments: [ new_ss.getAs(MimeType.PDF)] // send the new spreadsheet as PDF
}
MailApp.sendEmail(message);
DriveApp.getFileById(new_ss.getId()).setTrashed(true); // delete the new spreadsheet
}
我正尝试从传播sheet中select一个特定的sheet并在发送给收件人之前将其作为PDF附加到电子邮件中。
现在,下面的代码可以工作,但它是一种使用 for 循环和 if-else 来消除报告中所有其他不需要的 sheet 的变通方法。此代码还会关闭我的活动 sheet 并重新打开
我的主要问题是在附件中获取特定的 sheet,这样我就不必使用 for 循环
非常感谢任何帮助! :)
function sendReport() {
var sheetName="Report";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++)
if (sheets[i].getSheetName() !== sheetName) {
sheets[i].showSheet();
}
var message = {
to: "example@gmail.com",
subject: "ICT Online Helpdesk Report",
body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
name: "ICT Helpdesk",
attachments: [ ss.getAs(MimeType.PDF).setName("Monthly Ticket report")],
}
MailApp.sendEmail(message);
for (var i = 15; i < sheets.length; i++) {
sheets[i].showSheet()
}
}
我不明白你为什么说:“下面的代码有效”。它以 PDF 格式发送所有 sheet。
如果您只需要发送一个 sheet,您必须将 sheet 复制到一个新的 Spreadsheet 中并发送新的 Spreadsheet.
可能您需要这样的东西:
function sendReport() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // current spreadsheet
var sheet = ss.getSheetByName('Report'); // get the sheet 'Report'
var new_ss = SpreadsheetApp.create('Monthly Ticket report'); // create a new spreadsheet
sheet.copyTo(new_ss); // copy the 'Report' to the new spreadsheet
new_ss.deleteSheet(new_ss.getSheets()[0]); // remove the empty first sheet
var message = {
to: "example@mail.com",
subject: "ICT Online Helpdesk Report",
body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
name: "ICT Helpdesk",
attachments: [ new_ss.getAs(MimeType.PDF)] // send the new spreadsheet as PDF
}
MailApp.sendEmail(message);
DriveApp.getFileById(new_ss.getId()).setTrashed(true); // delete the new spreadsheet
}
如果您在复制的 sheet 上有图表和单元格引用,则在发送之前需要另一种算法。
您必须复制整个传播sheet(不仅仅是一个sheet),将sheet 'Report'上的所有引用转换为纯文本并删除sheet 的其余部分。
代码如下:
function sendReport() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // current spreadsheet
var file = DriveApp.getFileById(ss.getId()).makeCopy(); // copy of current spreadsheet
file.setName('Monthly Ticket report'); // rename the copy
var new_ss = SpreadsheetApp.openById(file.getId()); // open the copy
// convert all references into a plain text
var range = new_ss.getSheetByName('Report').getDataRange();
range.setValues(range.getDisplayValues());
// get all sheets but 'Report'
var sheets_to_remove = new_ss.getSheets().filter(x => x.getName() != 'Report');
sheets_to_remove.forEach(x => new_ss.deleteSheet(x)); // remove them
var message = {
to: "example@gmail.com",
subject: "ICT Online Helpdesk Report",
body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
name: "ICT Helpdesk",
attachments: [ new_ss.getAs(MimeType.PDF)] // send the new spreadsheet as PDF
}
MailApp.sendEmail(message);
DriveApp.getFileById(new_ss.getId()).setTrashed(true); // delete the new spreadsheet
}