我不明白为什么 google appscript 发送的是实际文件而不是副本
I cant figure out why google appscript is sending the actual file instead of the copy
所以,我最近一直在处理一个包含 google 工作表的项目,我在其中获取一些数据并使用该数据创建文件以作为电子邮件附件发送。我是
- 正在复制我的模板文件
- 为该模板副本文件设置名称
- 用新的副本 ID 打开它
- 我正在替换标签(更改复制模板文件的值)
- 通过电子邮件发送
function sendEmail(){
for (var row in rangeData) {
var varify = false;
var fileName = new Date().toString();
Logger.log("template " + templateId);
var fileId = DriveApp.getFileById(templateId).makeCopy().getId();
DriveApp.getFileById(fileId).setName(fileName);
var body = DocumentApp.openById(fileId).getBody();
Logger.log('current row ' + rangeData[row]);
for (var column in rangeData[row]) {
var target = firstRowMapped.indexOf(columnNames[column]);
if (target != -1) {
Logger.log('found Key');
try {
body.replaceText(firstRowMapped[target].toString(), rangeData[row]
[target].toString());
varify = true;
} catch (err) {
Logger.log(err);
}
}
}
if (varify == true) {
var toSend = DocumentApp.openById(fileId);
// send mail
try {
MailApp.sendEmail(rangeData[row][emailColumn], 'Test Email', rangeData[row][0], {
name: 'Emailer Script from DOER',
cc: rangeData[row][ccColumn],
attachments: toSend.getAs(MimeType.PDF)
});
Logger.log('sent');
} catch (err) {
Logger.log(err);
}
}
}
}
我正在 google 驱动器上获取我期望的文件。这些文件的 ID 与 toSend
的 ID 匹配,但是当我收到电子邮件时,我收到了 fileId
。几天来我一直在努力解决这个问题,但没有运气。有谁知道为什么会这样?有任何想法吗?我个人已经通过这个过程发送了无数附件(虽然不是使用模板)并且从未遇到过这个问题。
问题中的代码是打开文件的两个实例,修改一个,然后发送另一个(未修改的)实例。要解决此问题,您可以:
在打开另一个之前保存并关闭第一个实例
/* globals
rangeData, templateId, firstRowMapped,columnNames, emailColumn, ccColumn */
function sendEmail() {
...
var doc = DocumentApp.openById(fileId);
var body = doc.getBody();
...
doc.saveAndClose();
if (varify == true) {
var toSend = DocumentApp.openById(fileId);
// send mail
...
}
或者,只打开一个实例,并发送您修改的相同实例
// Don't close the doc before this
var toSend = doc;
重新打开并保存修复了我的错误。
var editFile = DocumentApp.openById(fileId);
var body = editFile.getBody();
var target = firstRowMapped.indexOf(columnNames[column]);
if (target != -1) {
Logger.log('found Key');
try {
Logger.log('row column ' + rangeData[row][target] + ' replacing ' +
firstRowMapped[target]);
body.replaceText(firstRowMapped[target].toString(), rangeData[row]
[target].toString());
Logger.log('replaced Key');
varify = true;
editFile.saveAndClose();
所以,我最近一直在处理一个包含 google 工作表的项目,我在其中获取一些数据并使用该数据创建文件以作为电子邮件附件发送。我是
- 正在复制我的模板文件
- 为该模板副本文件设置名称
- 用新的副本 ID 打开它
- 我正在替换标签(更改复制模板文件的值)
- 通过电子邮件发送
function sendEmail(){
for (var row in rangeData) {
var varify = false;
var fileName = new Date().toString();
Logger.log("template " + templateId);
var fileId = DriveApp.getFileById(templateId).makeCopy().getId();
DriveApp.getFileById(fileId).setName(fileName);
var body = DocumentApp.openById(fileId).getBody();
Logger.log('current row ' + rangeData[row]);
for (var column in rangeData[row]) {
var target = firstRowMapped.indexOf(columnNames[column]);
if (target != -1) {
Logger.log('found Key');
try {
body.replaceText(firstRowMapped[target].toString(), rangeData[row]
[target].toString());
varify = true;
} catch (err) {
Logger.log(err);
}
}
}
if (varify == true) {
var toSend = DocumentApp.openById(fileId);
// send mail
try {
MailApp.sendEmail(rangeData[row][emailColumn], 'Test Email', rangeData[row][0], {
name: 'Emailer Script from DOER',
cc: rangeData[row][ccColumn],
attachments: toSend.getAs(MimeType.PDF)
});
Logger.log('sent');
} catch (err) {
Logger.log(err);
}
}
}
}
我正在 google 驱动器上获取我期望的文件。这些文件的 ID 与 toSend
的 ID 匹配,但是当我收到电子邮件时,我收到了 fileId
。几天来我一直在努力解决这个问题,但没有运气。有谁知道为什么会这样?有任何想法吗?我个人已经通过这个过程发送了无数附件(虽然不是使用模板)并且从未遇到过这个问题。
问题中的代码是打开文件的两个实例,修改一个,然后发送另一个(未修改的)实例。要解决此问题,您可以:
在打开另一个之前保存并关闭第一个实例
/* globals
rangeData, templateId, firstRowMapped,columnNames, emailColumn, ccColumn */
function sendEmail() {
...
var doc = DocumentApp.openById(fileId);
var body = doc.getBody();
...
doc.saveAndClose();
if (varify == true) {
var toSend = DocumentApp.openById(fileId);
// send mail
...
}
或者,只打开一个实例,并发送您修改的相同实例
// Don't close the doc before this
var toSend = doc;
重新打开并保存修复了我的错误。
var editFile = DocumentApp.openById(fileId);
var body = editFile.getBody();
var target = firstRowMapped.indexOf(columnNames[column]);
if (target != -1) {
Logger.log('found Key');
try {
Logger.log('row column ' + rangeData[row][target] + ' replacing ' +
firstRowMapped[target]);
body.replaceText(firstRowMapped[target].toString(), rangeData[row]
[target].toString());
Logger.log('replaced Key');
varify = true;
editFile.saveAndClose();