Google脚本 - 创建PDF并不反映文档中的更改

时间:2014-11-19 20:40:49

标签: pdf google-apps-script google-sheets

我在电子表格中有一个脚本,可以接收来自表单的回复。使用这些回复和模板Google文档,我从模板创建一个新文档,然后用适当的数据替换占位符(例如' ## CLIENT ##')。效果很好。然后我尝试在同一文件夹中创建PDF副本。问题是PDF是原始模板而没有替换占位符... 我尝试添加一个中断来让文档更新:Utilities.sleep(15000);这没有用。我想我不明白文件是如何在我的功能之间传递的?

全局变量

var SOURCE_TEMPLATE = "{Document ID Here}";
var TARGET_FOLDER = "{Folder ID Here}";

代码:

//Get headers from spreadsheet and create a sorted array
var s = SpreadsheetApp.getActiveSheet();
var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];

// The variable e holds all the form values in an array.
// Assign values for each submission

if (e && e.namedValues){
var array_fields =[];

var project_manager = e.namedValues[headers[1]].toString();
var client = e.namedValues[headers[2]].toString();
var client_number = e.namedValues[headers[3]].toString();
var project_title = e.namedValues[headers[4]].toString();
var project_number = e.namedValues[headers[5]].toString();
var project_engineer = e.namedValues[headers[6]].toString();
var job_type = e.namedValues[headers[7]].toString();
var completion_date = e.namedValues[headers[14]].toString();
var project_cost = e.namedValues[headers[15]].toString();
var time = get_time();

array_fields.push(project_manager,client,client_number,project_title,pad(project_number),project_engineer,job_type,completion_date,'$'+ add_commas(project_cost),time);

var key_array  = ['##PROJECTMANAGER##','##CLIENT##','##CLIENTNUMBER##','##PROJECTTITLE##','##PROJECTNUMBER##','##PROJECTENGINEER##','##JOBTYPE##','##COMPLETIONDATE##','##PROJECTCOST##','##DATE##'];

var target = createDuplicateDocument(SOURCE_TEMPLATE, client_number + "-" + pad(project_number) +  " " + project_title + " Order Entry");

Logger.log("Created new document:" + target.getId());

for(var i=0; i<array_fields.length; i++) {
  var key = key_array[i]
  var value = array_fields[i]
  replaceParagraph(target, key, value);
}
Utilities.sleep(15000); 
savePDF(target); 

}

}

savePDf函数

function savePDF(doc) {

var docblob = doc.getAs('application/pdf');
var folder =  DocsList.getFolderById(TARGET_FOLDER);
docblob.setName(doc.getName())
folder.createFile(docblob);

}

因此savePDF函数应该创建已填充文档的PDF副本,而是在填充之前为我提供模板文档的PDF或新文档。 日志显示来自target.getID()的正确文档ID所以我不确定为什么target未正确传递给savePDF。我觉得这是一个小错误,但我无法确定问题所在。

1 个答案:

答案 0 :(得分:1)

在转换文档之前,您需要使用saveAndClose()来更新文档。

在您的代码中:

function savePDF(doc) {
  doc.saveAndClose();
  var docblob = doc.getAs('application/pdf');
  var folder =  DocsList.getFolderById(TARGET_FOLDER);
  docblob.setName(doc.getName())
  folder.createFile(docblob);
}

你不需要睡眠延迟,你可以删除它,除非你想等待15秒; - )