0

I have the following script that takes a row a from a spreadsheet and replaces placeholders in a document if the column name matches. I use the %placeHolder% format. The replaceText() method works perfectly, but if that field is blank, how can I have it replace the place holder to blank or "N/A"? I've tried a couple different routes but am probably missing something simple.

function formatTemplate(){
  var postFlightTemplate = DocsList.getFileById('templateKey').makeCopy().getId();

  var template = DocumentApp.openById(postFlightTemplate);
  var templateHeader = template.getHeader();
  var templateBody = template.getActiveSection();

  var flightLog = SpreadsheetApp.openById('spreadsheetKey');
  var sheet = flightLog.getSheetByName('Flight Tracking');
  var data = ScriptsLib.getRowsData(sheet, sheet.getRange('A2:2'), 1);

  var keys = ScriptsLib.getKeys(data[0]);

  for (var key in keys){
    Logger.log('key:'+keys[key]+' / value:'+data[0][keys[key]]);
    if (data[0][keys[key]] != null || data[0][keys[key]] != ''){
      templateHeader.replaceText('%'+keys[key]+'%', data[0][keys[key]]);
      templateBody.replaceText('%'+keys[key]+'%', data[0][keys[key]]);
    }else{
      Logger.log('empty key:'+keys[key]+' / value:'+data[0][keys[key]]);
      templateBody.replaceText('%'+keys[key]+'%', 'N/A');
    }
  }
  template.setName('RR-'+data[0].incidentNumber+'-'+data[0].flightNumber);
  template.saveAndClose();

  MailApp.sendEmail('email@email.com', 'Post Flight Report','See Run Report', {name: 'P1AR Flight Log', attachments: template});
}
4

2 回答 2

2

你没有说,但显然你正在使用一个库,“ScriptsLib”。我已经进行了搜索,但找不到任何具有getRowsDatagetKeys方法的公共代码,所以它可能是一个私有库。

我需要对这两个函数的作用做一些猜测。如果您可以从您的 ScriptsLib 中提供它们的源代码,这将有助于验证或修改我的猜测,它们是:

getRowsData方法通过调用创建一个对象数组getObjects。该getObjects方法遍历给定的范围,从每一行创建一个具有命名属性的对象数组。如果一行中有一个空白单元格,则不会有具有该列名称的属性。

在您的代码中,您循环遍历 中包含的键data[0],当源数据中有空白时,由于工作方式的原因,这些键将不完整(缺少属性)getObjects。这意味着您永远不会真正处理空白,也没有机会用“N/A”替换相关键。

然后,您需要做的是遍历模板文档中的键值 - 这些键值可能由电子表格中的标题表示。(...在标准化为 camelCase 之后,即)。

var keys = ScriptsLib.normalizeHeaders(sheet.getRange('A1:1').getValues()[0]); 

这将为我们提供要迭代的完整键列表。但我们还没有完成。

您在检查您是否拥有属性的逻辑中存在错误。看看这一行:

if (data[0][keys[key]] != null || data[0][keys[key]] != ''){

使用 OR 运算符,您最终将在 data[0][keys[key]] 为 null时执行 IF 块。您编写了一个 else 子句,应该用“N/A”替换一个键,但它不会被执行。

                            :: when data[0][keys[key]] == null
data[0][keys[key]] != null  :: false
data[0][keys[key]] != ''    :: true (because null != '')

您可能打算使用 AND。

if (data[0][keys[key]] != null && data[0][keys[key]] != ''){

应该使事情按照你想要的方式工作。但我建议明确处理数据对象不具有具有特定键名的属性的可能性,并同时解决该问题和/或错误。JavaScript 让我们hasOwnProperty()可以做到这一点。

if (data[0].hasOwnProperty(keys[key])) // property is present

重构后的代码变为:

function formatTemplate(){
  var postFlightTemplate = DocsList.getFileById('templateKey').makeCopy().getId();

  var template = DocumentApp.openById(postFlightTemplate);
  var templateHeader = template.getHeader();
  var templateBody = template.getActiveSection();

  var flightLog = SpreadsheetApp.openById('spreadsheetKey');
  var sheet = flightLog.getSheetByName('Flight Tracking');
  var data = ScriptsLib.getRowsData(sheet, sheet.getRange('A2:2'), 1);

  var keys = ScriptsLib.normalizeHeaders(sheet.getRange('A1:1').getValues()[0]); 

  for (var key in keys){
    if (data[0].hasOwnProperty(keys[key])) { // property is present
      Logger.log('key:'+keys[key]+' / value:'+data[0][keys[key]]);
      templateHeader.replaceText('%'+keys[key]+'%', data[0][keys[key]]);
      templateBody.replaceText('%'+keys[key]+'%', data[0][keys[key]]);
    }else{
      Logger.log('empty key:'+keys[key]+' / value:'+data[0][keys[key]]);
      templateBody.replaceText('%'+keys[key]+'%', 'N/A');
    }
  }
  template.setName('RR-'+data[0].incidentNumber+'-'+data[0].flightNumber);
  template.saveAndClose();

  MailApp.sendEmail('email@email.com', 'Post Flight Report','See Run Report', {name: 'P1AR Flight Log', attachments: template});
}
于 2013-04-30T17:13:45.613 回答
2

您可以查看代码的以下部分,我在几行末尾添加了两条注释:

for (var key in keys){
    Logger.log('key:'+keys[key]+' / value:'+data[0][keys[key]]);
    if (data[0][keys[key]] != null || data[0][keys[key]] != undefined){ // I changed this to undefined
      templateHeader.replaceText('%'+keys[key]+'%', data[0][keys[key]]);
      templateBody.replaceText('%'+keys[key]+'%', data[0][keys[key]]);
    }else{
      Logger.log('empty key:'+keys[key]+' / value:'+data[0][keys[key]]);
      templateHeader.replaceText('%'+keys[key]+'%', 'N/A'); // I added this row
      templateBody.replaceText('%'+keys[key]+'%', 'N/A');
    }
  }
于 2013-04-30T16:59:46.940 回答