首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google脚本-对webapp中使用的类方法的回调

Google脚本-对webapp中使用的类方法的回调
EN

Stack Overflow用户
提问于 2019-11-16 15:29:21
回答 1查看 249关注 0票数 2

我有一个气体,我提交了一份表格在我的网络应用程序。它做了以下工作:

  1. 打开一个模板文档,其中包含与表单上表单字段名称相对应的占位符(以##form_field_name##格式)。
  2. 生成模板的副本并将其保存到适当的位置。
  3. 迭代提交的值,并执行body.replaceText('##' + key + '##', val);将值填充到文档中。
  4. 对于保留空白的任何字段(因为当前未与表单一起提交),是否有一个body.replaceText('##.*##', '');来删除place字符串?

最后,我得到了一个看起来用户根本没有提交任何数据的文档。我的猜测是,这是因为#4是在3号完成之前运行。是否有任何方法将#4指定为回调?类似于:

代码语言:javascript
复制
body.replaceText('##' + key + '##', val, () => {
    body.replaceText('##.*##', '');
});

下面是执行replaceText()ing的函数的代码:

代码语言:javascript
复制
/**
 * 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*

下面是一个传递给函数的对象的示例:

代码语言:javascript
复制
{
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"
}

并且可以访问该文档的经过水处理的版本这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-17 03:45:28

  • 您希望使用'##' + key + '##'va;替换为使用objbody.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('##.*##', '');删除。我想这可能是你出问题的原因。

修改脚本:

修改脚本时,请按以下方式修改。

发自:

代码语言:javascript
复制
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('##.*##', '');
  }
}

至:

代码语言:javascript
复制
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('##.*##', '');
  • 在这个修改中,首先在for循环中运行body.replaceText('##' + key + '##', val);。然后,在for循环的外部运行body.replaceText('##.*##', '');

注意:

  • 如果需要saveAndClose(),那么把doc.saveAndClose()放在body.replaceText('##.*##', '');之后怎么样?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58892268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档