【问题标题】:Weird Behaviour with DriveApp.getFileById()DriveApp.getFileById() 的奇怪行为
【发布时间】:2018-09-11 14:56:46
【问题描述】:

代码仍处于概念验证阶段 - 将尝试解释预期结果以及我得到的结果。

此脚本将是一个通用邮件合并。 该脚本应执行以下操作:

  • 提示用户输入要使用的模板文件的 ID。 (谷歌文档)
  • 制作模板副本并更改模板副本正文中的值。
  • 获取模板的编辑副本并将其附加到电子邮件中。
  • 对电子表格中的每一行执行一次。

虽然上面的一切工作得很好,但在附加模板的编辑副本时会出现奇怪的行为。我没有获得模板的编辑版本,而是获得了附加到电子邮件的未编辑版本的模板

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

使用的电子表格:

预期结果:

实际结果:

【问题讨论】:

  • 为了保存编辑的文档,把doc.saveAndClose()放在var attatchment = DriveApp.getFileById(doc.getId());前面怎么样? saveAndClose() 的文档是here。如果这仍然不起作用,请告诉我。我想考虑其他解决方案。
  • 因为如此简单的事情而自责的经典案例。谢谢 Tanaike,完全忘记了保存和关闭。工作得很好。请提交答案,我会将其标记为正确。 史诗掌上
  • 感谢您的回复。我将其发布为答案。你能确认一下吗?

标签: google-apps-script google-drive-api google-docs


【解决方案1】:

根据您的脚本,我认为可能需要使用saveAndClose()。因此,例如在您的脚本中,请将其添加到var attatchment = DriveApp.getFileById(doc.getId()); 之前,如下所示。

var subject = "See attatched";
doc.saveAndClose(); // Added
var attatchment = DriveApp.getFileById(doc.getId());

参考:

附加信息:

在DocumentApp、SpreadsheetApp和SlidesApp类中,当通过各个类的方法修改Doc时,在脚本运行的情况下,通过save方法保存Doc来体现修改。另一方面,在 Sheets API 和 Slides API 的 Google API 中,当调用并运行每个方法时,即使脚本正在运行,也会反映修改。在 Google Document,还没有 Docs API。但最近,the form about the early access of Docs API 发布了。当Docs API可以使用时,我认为API的方法也许可以不用saveAndClose()就可以编辑和保存文档。

【讨论】:

  • 再次感谢 Tanaike。
  • @New_2_Code 欢迎。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2015-07-20
  • 2010-10-03
  • 2021-07-12
  • 2013-10-04
  • 2019-01-23
相关资源
最近更新 更多