Google 表格和 Apps 脚本上的邮件合并
Mail Merge on Google Sheets and Apps Script
我目前有一个脚本,它将获取特定的 sheet 并将其作为 PDF 发送到单元格 C8 上的电子邮件地址,当前通过在下拉列表中选择一个名称来填充此单元格,就像我们一样用它来发送收据,有没有办法循环脚本并发送带有各自副本的自动电子邮件?我已经尝试使用 for
语句,但到目前为止没有成功。在我的代码下方(它运行良好,但仅适用于一封电子邮件)和一个 spreadsheet 示例。关于如何实现这一点有什么想法吗?
function emailSpreadsheetAsPDF() {
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PDF").getRange("C8");
var email = emailRange.getValues();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("PDF"); // Enter the name of the sheet here
var subject = "Test Receipt ";
var body = "\n Please see attached your current test receipt: ";
// Base URL
var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());
/* Specify PDF export parameters
From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
*/
var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
+ '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&gid='; // the sheet's Id
var token = ScriptApp.getOAuthToken();
var response = UrlFetchApp.fetch(url + url_ext + sheet.getSheetId(), {
headers : {
'Authorization' : 'Bearer ' + token
}
}).getBlob().setName(sheet.getName() + ".pdf");
// Uncomment the line below to save the PDF to the root of your drive.
// var newFile = DriveApp.createFile(response).setName(sheet.getName() + ".pdf")
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {
htmlBody : body,
attachments : [response]
});
}
https://docs.google.com/spreadsheets/d/1p4p9A9z8-EqlFGnlJ1o360gA8lcp-L29iuIPNylC4e8/edit?usp=sharing
我相信你的目标如下。
- 您想通过更改 sheet
PDF
中单元格“C6”的名称来发送电子邮件。
- 您想使用 Google Apps 脚本实现此目的。
修改点:
首先,关于MATCH
,第3个参数的默认值为1
。因此,在您的情况下,需要设置 0
。所以请修改“C8”、“E17”、“E19”、“E21”的公式如下
- C8:
=INDEX(Sheet2!B3:B,MATCH(C6,Sheet2!A3:A,0))
- E17:
=INDEX(Sheet2!C3:C,MATCH(C6,Sheet2!A3:A,0))
- E19:
=INDEX(Sheet2!D3:D,MATCH(C6,Sheet2!A3:A,0))
- E21:
=INDEX(Sheet2!E3:E,MATCH(C6,Sheet2!A3:A,0))
对于你的情况,我认为有几种方法。所以在这个回答中,我想提出以下流程。
- 从“Sheet2”中检索值。
- 创建 sheet 用于转换为 PDF 数据。
- 这部分在循环中运行。
- 复制sheet
PDF
作为模板。
- 在单元格“C6”中设置名称。
- 将模板 sheet 导出为 PDF 数据。
- 使用名字“C6”对应的邮箱发送邮件。
- 删除模板sheet。
修改后的脚本:
function myFunction() {
// 1. Retrieve values from "Sheet2".
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet2");
var values = sheet.getRange("A3:A" + sheet.getLastRow()).getValues();
var template = ss.getSheetByName("PDF");
var ssId = ss.getId();
var token = ScriptApp.getOAuthToken();
var filenameOfPdf = template.getSheetName();
// 2. Create sheets for converting to PDF data.
values.forEach(([v], i) => {
// 1. Copy the sheet `PDF` as the template.
var temp = template.copyTo(ss).setName("temp" + (i + 1));
// 2. Set the name at the cell "C6".
temp.getRange("C6").setValue(v);
SpreadsheetApp.flush();
var email = temp.getRange("C8").getValue();
// 3. Export the template sheet as the PDF data.
var subject = "Test Receipt ";
var body = "\n Please see attached your current test receipt: ";
var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ssId);
var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
+ '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&gid='; // the sheet's Id
var response = UrlFetchApp.fetch(url + url_ext + temp.getSheetId(), {headers : {'Authorization' : 'Bearer ' + token}}).getBlob().setName(filenameOfPdf + ".pdf");
// 4. Send an email using the email corresponding to the name of "C6".
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {htmlBody : body,attachments : [response]});
// 5. Delete the template sheet.
ss.deleteSheet(temp);
});
}
参考文献:
我目前有一个脚本,它将获取特定的 sheet 并将其作为 PDF 发送到单元格 C8 上的电子邮件地址,当前通过在下拉列表中选择一个名称来填充此单元格,就像我们一样用它来发送收据,有没有办法循环脚本并发送带有各自副本的自动电子邮件?我已经尝试使用 for
语句,但到目前为止没有成功。在我的代码下方(它运行良好,但仅适用于一封电子邮件)和一个 spreadsheet 示例。关于如何实现这一点有什么想法吗?
function emailSpreadsheetAsPDF() {
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PDF").getRange("C8");
var email = emailRange.getValues();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("PDF"); // Enter the name of the sheet here
var subject = "Test Receipt ";
var body = "\n Please see attached your current test receipt: ";
// Base URL
var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());
/* Specify PDF export parameters
From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
*/
var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
+ '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&gid='; // the sheet's Id
var token = ScriptApp.getOAuthToken();
var response = UrlFetchApp.fetch(url + url_ext + sheet.getSheetId(), {
headers : {
'Authorization' : 'Bearer ' + token
}
}).getBlob().setName(sheet.getName() + ".pdf");
// Uncomment the line below to save the PDF to the root of your drive.
// var newFile = DriveApp.createFile(response).setName(sheet.getName() + ".pdf")
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {
htmlBody : body,
attachments : [response]
});
}
https://docs.google.com/spreadsheets/d/1p4p9A9z8-EqlFGnlJ1o360gA8lcp-L29iuIPNylC4e8/edit?usp=sharing
我相信你的目标如下。
- 您想通过更改 sheet
PDF
中单元格“C6”的名称来发送电子邮件。 - 您想使用 Google Apps 脚本实现此目的。
修改点:
首先,关于
MATCH
,第3个参数的默认值为1
。因此,在您的情况下,需要设置0
。所以请修改“C8”、“E17”、“E19”、“E21”的公式如下- C8:
=INDEX(Sheet2!B3:B,MATCH(C6,Sheet2!A3:A,0))
- E17:
=INDEX(Sheet2!C3:C,MATCH(C6,Sheet2!A3:A,0))
- E19:
=INDEX(Sheet2!D3:D,MATCH(C6,Sheet2!A3:A,0))
- E21:
=INDEX(Sheet2!E3:E,MATCH(C6,Sheet2!A3:A,0))
- C8:
对于你的情况,我认为有几种方法。所以在这个回答中,我想提出以下流程。
- 从“Sheet2”中检索值。
- 创建 sheet 用于转换为 PDF 数据。
- 这部分在循环中运行。
- 复制sheet
PDF
作为模板。 - 在单元格“C6”中设置名称。
- 将模板 sheet 导出为 PDF 数据。
- 使用名字“C6”对应的邮箱发送邮件。
- 删除模板sheet。
- 复制sheet
- 这部分在循环中运行。
修改后的脚本:
function myFunction() {
// 1. Retrieve values from "Sheet2".
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet2");
var values = sheet.getRange("A3:A" + sheet.getLastRow()).getValues();
var template = ss.getSheetByName("PDF");
var ssId = ss.getId();
var token = ScriptApp.getOAuthToken();
var filenameOfPdf = template.getSheetName();
// 2. Create sheets for converting to PDF data.
values.forEach(([v], i) => {
// 1. Copy the sheet `PDF` as the template.
var temp = template.copyTo(ss).setName("temp" + (i + 1));
// 2. Set the name at the cell "C6".
temp.getRange("C6").setValue(v);
SpreadsheetApp.flush();
var email = temp.getRange("C8").getValue();
// 3. Export the template sheet as the PDF data.
var subject = "Test Receipt ";
var body = "\n Please see attached your current test receipt: ";
var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ssId);
var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
+ '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&gid='; // the sheet's Id
var response = UrlFetchApp.fetch(url + url_ext + temp.getSheetId(), {headers : {'Authorization' : 'Bearer ' + token}}).getBlob().setName(filenameOfPdf + ".pdf");
// 4. Send an email using the email corresponding to the name of "C6".
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {htmlBody : body,attachments : [response]});
// 5. Delete the template sheet.
ss.deleteSheet(temp);
});
}