DriveApp.getFileById() 的奇怪行为
Weird Behaviour with DriveApp.getFileById()
代码仍处于概念验证阶段 - 将尝试解释预期结果以及我得到的结果。
此脚本将是一个通用的邮件合并。
该脚本应执行以下操作:
- 提示用户输入要使用的模板文件的 ID。 (Google 文档文档)
- 复制模板并更改模板副本正文中的值。
- 获取模板的编辑副本并将其附加到电子邮件中。
- 对电子表格中的每一行执行一次。
虽然上面的一切都运行良好,但在附加模板的编辑副本时会出现奇怪的行为。我没有得到模板的编辑版本,而是得到了附加到电子邮件的未编辑版本的模板
function myFunction() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt('Please enter the ID of your template file.', ui.ButtonSet.OK_CANCEL);
if(response.getSelectedButton() == ui.Button.OK){
var templateid = response.getResponseText()
}//End of IF Statement
var docid = DriveApp.getFileById(templateid).makeCopy().getId();
var doc = DocumentApp.openById(docid);
var body = doc.getBody();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastColumn = sheet.getLastColumn();
sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setNumberFormat("@");
var array = [];
for(var i = 1; i < lastColumn-1; i++) {
var headers = sheet.getRange(1, i, 1, 1).getValue();
array.push(headers)
}//END OF OUTER 1
for (var k = 2; k < sheet.getLastRow()+1; k++){
var row = sheet.getRange(k, 1, 1, lastColumn).getValues()
for (var j = 0; j <array.length; j++){
body.replaceText("<"+array[j]+">", row[0][j]);
}//END OF INNER
var recipient = sheet.getRange(k, lastColumn - 1, 1, 1).getValue();
var emailBody = "Good Day,\n\nPlease see attatched.\n\nRegards\nPerson's Name Here"
var subject = "See attatched";
var attatchment = DriveApp.getFileById(doc.getId());
Logger.log(doc.getId())
MailApp.sendEmail(recipient, subject, emailBody, {attachments: attatchment})
}//END OF OUTER 2
}//END OF FUNCTION
使用的电子表格:
预期结果:
实际结果:
根据您的脚本,我认为可能需要使用 saveAndClose()
。所以在你的脚本中,例如,请在var attatchment = DriveApp.getFileById(doc.getId());
之前添加如下。
var subject = "See attatched";
doc.saveAndClose(); // Added
var attatchment = DriveApp.getFileById(doc.getId());
参考:
附加信息:
在DocumentApp、SpreadsheetApp和SlidesApp的classes中,当Doc被各自class的方法修改时,在脚本为运行ning的情况下,通过使用 save 方法保存 Doc 来反映修改。另一方面,在 Google API 的 Sheets API 和 Slides API 中,当每个方法被调用并且 运行 时,修改被反映出来,甚至如果脚本是 运行ning。在 Google 文档中,还没有文档 API。但是最近,the form about the early access of Docs API 发布了。等到Docs API可以用的时候,我想API的方法或许可以不使用saveAndClose()
.
来编辑和保存文档
代码仍处于概念验证阶段 - 将尝试解释预期结果以及我得到的结果。
此脚本将是一个通用的邮件合并。 该脚本应执行以下操作:
- 提示用户输入要使用的模板文件的 ID。 (Google 文档文档)
- 复制模板并更改模板副本正文中的值。
- 获取模板的编辑副本并将其附加到电子邮件中。
- 对电子表格中的每一行执行一次。
虽然上面的一切都运行良好,但在附加模板的编辑副本时会出现奇怪的行为。我没有得到模板的编辑版本,而是得到了附加到电子邮件的未编辑版本的模板
function myFunction() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt('Please enter the ID of your template file.', ui.ButtonSet.OK_CANCEL);
if(response.getSelectedButton() == ui.Button.OK){
var templateid = response.getResponseText()
}//End of IF Statement
var docid = DriveApp.getFileById(templateid).makeCopy().getId();
var doc = DocumentApp.openById(docid);
var body = doc.getBody();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastColumn = sheet.getLastColumn();
sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setNumberFormat("@");
var array = [];
for(var i = 1; i < lastColumn-1; i++) {
var headers = sheet.getRange(1, i, 1, 1).getValue();
array.push(headers)
}//END OF OUTER 1
for (var k = 2; k < sheet.getLastRow()+1; k++){
var row = sheet.getRange(k, 1, 1, lastColumn).getValues()
for (var j = 0; j <array.length; j++){
body.replaceText("<"+array[j]+">", row[0][j]);
}//END OF INNER
var recipient = sheet.getRange(k, lastColumn - 1, 1, 1).getValue();
var emailBody = "Good Day,\n\nPlease see attatched.\n\nRegards\nPerson's Name Here"
var subject = "See attatched";
var attatchment = DriveApp.getFileById(doc.getId());
Logger.log(doc.getId())
MailApp.sendEmail(recipient, subject, emailBody, {attachments: attatchment})
}//END OF OUTER 2
}//END OF FUNCTION
使用的电子表格:
预期结果:
实际结果:
根据您的脚本,我认为可能需要使用 saveAndClose()
。所以在你的脚本中,例如,请在var attatchment = DriveApp.getFileById(doc.getId());
之前添加如下。
var subject = "See attatched";
doc.saveAndClose(); // Added
var attatchment = DriveApp.getFileById(doc.getId());
参考:
附加信息:
在DocumentApp、SpreadsheetApp和SlidesApp的classes中,当Doc被各自class的方法修改时,在脚本为运行ning的情况下,通过使用 save 方法保存 Doc 来反映修改。另一方面,在 Google API 的 Sheets API 和 Slides API 中,当每个方法被调用并且 运行 时,修改被反映出来,甚至如果脚本是 运行ning。在 Google 文档中,还没有文档 API。但是最近,the form about the early access of Docs API 发布了。等到Docs API可以用的时候,我想API的方法或许可以不使用saveAndClose()
.