【问题标题】:Google Script - Creating PDF doesn't reflect changes in DocumentGoogle Script - 创建 PDF 不会反映文档中的更改
【发布时间】:2014-11-19 20:40:49
【问题描述】:

我在电子表格中有一个脚本,用于接收来自表单的响应。使用这些响应和模板 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); 

}

}

保存PDF函数

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。我觉得这是一个小错误,但我无法确定问题所在。

【问题讨论】:

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


    【解决方案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 秒,否则可以将其移除;-)

    【讨论】:

    • 啊,不知道 saveAndClose()。学到了一些新东西。非常感谢!睡觉是最后的想法,我希望我不需要它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2011-04-20
    相关资源
    最近更新 更多