我有一个气体,我提交了一份表格在我的网络应用程序。它做了以下工作:
##form_field_name##格式)。body.replaceText('##' + key + '##', val);将值填充到文档中。body.replaceText('##.*##', '');来删除place字符串?最后,我得到了一个看起来用户根本没有提交任何数据的文档。我的猜测是,这是因为#4是在3号完成之前运行。是否有任何方法将#4指定为回调?类似于:
body.replaceText('##' + key + '##', val, () => {
body.replaceText('##.*##', '');
});下面是执行replaceText()ing的函数的代码:
/**
* Iterate through obj of keys/values and replace ##key##
* with value in doc
**/
function doFindAndReplace(obj, doc) {
try {
//body = doc.getBody();
var id = doc.getId();
var _doc = DocumentApp.openById(id);
var body = _doc.getBody();
//var doc = _doc;
//Logger.log(body);
for (var prop in obj) {
if(obj.hasOwnProperty(prop)) {
var val = obj[prop];
var key = prop.indexOf('intake') === 0 ? prop.toUpperCase() : '';
//Logger.log(key + ' = ' + val);
//Logger.log(typeof val);
body.replaceText('##' + key + '##', val);
_doc.saveAndClose();
var _doc2 = DocumentApp.openById(id);
body = _doc2.getBody();
body.replaceText('##.*##', '');
}
}
} catch(e) {
Logger.log('doFindAndReplace() | ' + e);
errors.push({
fxn: 'doFindAndReplace',
msg: e,
custom: 'id=' + id
});
return false;
}
return doc;
}参数obj是一个包含提交的表单数据的对象,doc是对正在进行查找和替换的新创建文档的引用。
如果不可能这样的话,我正在考虑添加一个onOpen触发器来运行#4 (body.replaceText('##.*##', '');)。这将要求用户在联机时第一次打开文档,并且很大一部分用例正在脱机使用新创建的文档。
有人能提出另一个解决办法吗?
编辑*
我将代码(反映在上面)更新为saveAndClose(),然后在运行第二个replaceText()之前重新打开。我得到以下错误:
文档已关闭,其内容无法更新。
我知道,你会认为它会出现在saveAndClose()之后。但这是错误点所在的线,即使我删除了后面的其他行,也会发生同样的错误。
如果我按原样删除代码的saveAndClose()行,我就会再次遇到原来的问题。
我不认为这和使用DriveApp.getFileById()的奇怪行为是同一个问题
编辑2*
下面是一个传递给函数的对象的示例:
{
intake_activity_level: "Normal",
intake_assessment_comments: "",
intake_client_addr: "1600 Fake St XXXX, XX 12345",
intake_client_email: "xxx@gmail.com",
intake_client_name: "Dan Tester",
intake_client_phone: "(917) 555-1212",
intake_consent: "yes",
intake_consent_owner: "Jim David",
intake_food_intake: "Decreased",
intake_gen_food: "",
intake_gen_health: "sit dolam amet",
intake_gen_meds: "re et sapien et, consectetur rhoncus lacus. Aliqua Vivamus ipsum diam, venenatis a turpis eget, volu",
intake_gen_reasons: "Lorem ipsum",
intake_gen_vaccine: "Yes",
intake_misc_comments: "",
intake_misc_descriptor: "wood",
intake_panting: "Increased",
intake_pet_breed: "Pug",
intake_pet_dob: "8/11/2015",
intake_pet_name: "FLuffy",
intake_pet_sex: "Spayed Female",
intake_pet_species: "Dog",
intake_pet_weight: "140lbs",
intake_sleep: "Increased",
intake_source: "Sally Balls",
intake_stiffness: "Normal",
intake_symptoms: "coughing, belching or gas",
intake_vet: "Urban Vet",
intake_voice: "Increased",
intake_water_intake: "Decreased"
}并且可以访问该文档的经过水处理的版本这里。
发布于 2019-11-17 03:45:28
'##' + key + '##'将va;替换为使用obj的body.replaceText('##' + key + '##', val);。##.*##替换为'',代之以body.replaceText('##.*##', '');。body.replaceText('##.*##', '');之后运行body.replaceText('##' + key + '##', val);。如果我的理解是正确的,那么这个答案呢?
在当前脚本中,body.replaceText('##.*##', '');放在for循环中。这样,只使用intake_activity_level: "Normal",,而不使用其他对象。在本例中,在运行第一个body.replaceText('##' + key + '##', val);之后,所有##key##值都由body.replaceText('##.*##', '');删除。我想这可能是你出问题的原因。
修改脚本:
修改脚本时,请按以下方式修改。
发自:
for (var prop in obj) {
if(obj.hasOwnProperty(prop)) {
var val = obj[prop];
var key = prop.indexOf('intake') === 0 ? prop.toUpperCase() : '';
//Logger.log(key + ' = ' + val);
//Logger.log(typeof val);
body.replaceText('##' + key + '##', val);
_doc.saveAndClose();
var _doc2 = DocumentApp.openById(id);
body = _doc2.getBody();
body.replaceText('##.*##', '');
}
}至:
for (var prop in obj) {
if(obj.hasOwnProperty(prop)) {
var val = obj[prop];
var key = prop.indexOf('intake') === 0 ? prop.toUpperCase() : '';
body.replaceText('##' + key + '##', val);
}
}
body.replaceText('##.*##', '');body.replaceText('##' + key + '##', val);。然后,在for循环的外部运行body.replaceText('##.*##', '');。注意:
saveAndClose(),那么把doc.saveAndClose()放在body.replaceText('##.*##', '');之后怎么样?https://stackoverflow.com/questions/58892268
复制相似问题