google-apps-script - 我正在尝试使用脚本将 Google Drive 附件发送到不同的电子邮件地址,但努力使其工作
问题描述
我是编码新手,想自动发送带附件的电子邮件。基本上我想做的是将消息和 Google Drive 附件发送到我的电子表格中的特定电子邮件地址。每个电子邮件地址的每个附件(谷歌驱动器链接)都不同,我将所有内容都放在电子表格中。
电子表格由三张表组成,我只想从第一张表中获取信息(称为完整数据)。列的结构如下:
- A1 全名
- B1 名字
- C1 姓氏
- D1 电子邮件地址
- E1 文件附件(谷歌驱动链接)
- F1 日期
- G1 状态
- H1 留言
- I1 电子邮件已发送?
我想发送一封带有以“Hello {Full Name}”开头的模板的电子邮件,并在下面的行中开始消息。
这是我现在拥有的代码:
// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = 'EMAIL_SENT';
/**
* Sends non-duplicate emails with data from the current spreadsheet.
*/
function sendEmails2() {
var sheet = SpreadsheetApp.getActiveSheet();
var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
var startCol = 1;
var numCols = 4; // Number of columns to process (should include column D)
// Fetch the range of cells A2:D
var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[3]; // Third column
var message = row[7]; // Eigth column
var emailSent = row[8]; // Ninth column
if (emailSent !== EMAIL_SENT) { // Prevents sending duplicates
var subject = 'Sending emails from a Spreadsheet';
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
我意识到我没有为附件设置变量。附件应取自 E 列(对应于行)。例如,A2 中的 John Apple 在 E2 中具有附件 X,而 A3 中的 Mick Orange 在 E3 中具有附件 Y,依此类推……数据范围下降到 130 行,但如果有总是能得到的东西就好了直到有数据的范围(无论行数)。
有没有人知道如何进行这项工作?
非常感谢提前!!
解决方案
如果我理解正确,您当前的问题与您之前的问题不同之处在于:
- 消息正文以“Hello {Full Name}”开头。
- 您不是在寻找与工作表中名称相同的文件,而是在寻找具有特定 URL 的文件。
- 从中获取数据的列不同。
考虑到所有这些,我重新设计了我在您之前的问题中提出的解决方案,以便它可以完成您现在假装的工作(阅读内联注释以了解代码在做什么,逐步进行):
var EMAIL_SENT = "EMAIL_SENT";
function sendEmails2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Full Data");
var startRow = 2; // First row of data to process
var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
var startCol = 1;
var numCols = 9; // Number of columns to process (should include column D)
// Fetch the range of cells A2:D
var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);
// Fetch values for each row in the Range.
var data = dataRange.getValues();
for (var i = 0; i < data.length; i++) {
var row = data[i];
var emailAddress = row[3];
var fullname = row[0];
var messageBody = row[7];
var message = "Hello ".concat(fullname, "\n", messageBody); // Creating message body
var emailSent = row[8];
var fileURL = row[4];
var fileId = fileURL.match(/[-\w]{25,}/); // Extracts file id from file url
if (emailSent != EMAIL_SENT) { // Prevents sending duplicates
var subject = "Sending emails from a Spreadsheet";
var file = DriveApp.getFileById(fileId);
MailApp.sendEmail(emailAddress, subject, message, {
attachments: [file], // No need to use getAs if your file is already a PDF
name: 'Custom email Team'
});
sheet.getRange(startRow + i, 9).setValue(EMAIL_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
DriveApp没有getFileByUrl
方法,因此要获取文件,代码首先使用正则表达式从 url 中提取文件 id,然后调用getFileById。
让我知道这是否适合你。
推荐阅读
- json - 在列表视图中切换排序
- python - 两个相同的 python 脚本,但只有一个在气流中工作,而另一个不工作?
- testing - 基于 API 的测试是黑盒测试还是灰盒测试?
- google-ads-api - Google Ads - 类别错误
- python - 在堆栈图的弹出窗口中打印图例
- python - 如何在 np.where 中使用表示条件的变量作为 pandas 中具有列表值的列?
- powershell - 暂停 Windows 更新长达 35 天,并通过 powershell 找出暂停更新的日期
- javascript - 如何使用字符串类型对象的键值对对象数组进行排序
- postgresql - 升级 postgres 10.6 到 12.3
- python - 在数据框python中解压字典值