如果文本存在,则设置相邻单元格的公式

时间:2015-04-30 00:55:50

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

我正在使用Google表格表格,该表格也通过短信接受答案。我正在尝试使用Google Apps脚本制作一种方法,使用逗号作为分隔符来拆分文本消息的正文。

screenshot

我遇到的问题是覆盖表单提交的信息,而不是短信。

screenshot 2

我目前的脚本是:

function splitCells() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var colC = sheet.getRange("C2:C").getValues();
  var colD = sheet.getRange("D2:D").getFormulas();
  //Logger.log(colC);
  for(var i in colC){
    if(typeof(colC[i][0]) =='string'){
      colD = '=if(istext(C2:C),split(C2:C,",",true))';
    } else {
      colD = 'D2:D';
    }
  }
  sheet.getRange("D2:D").setFormula(colD);
}

该功能正常工作,按预期将C列(SMS正文)的内容拆分为D,E和F.但是,它会覆盖D列中的数据,因为else条件未得到满足(colC在这些位置是空白的)。

如何在不替换单元格内容的情况下让脚本移动空白单元格?

解释时有点令人困惑,所以here's a sample document你可以查看。打开它时应安装自定义菜单,您可以从那里(或从编辑器)运行脚本。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

有一些简单的错误可以开始。

  • 电子表格单元格可以包含值或公式,而不是两者。

  • 如果您使用function fullMatch (regexp, string) { return (new RegExp('^'+regexp.source+'$', String(regexp).split('/').reverse()[0])).test(string); } ,则单元格中的任何值都将替换为公式的结果,即使公式为空

    由于您希望混合使用值和公式,因此应仅在符合条件的特定单元格中设置公式:

    setFormula/s()
  • 标准测试不够充分。空白单元格仍然是字符串类型,但它是一个空白字符串。因此,对于表单条目和SMS条目,此计算结果为true:

    // If we received a SMS response, set a formula to parse it
    sheet.getRange(2+i,4).setValue('=if(istext(C2:C),split(C2:C,",",true),"")')
    

    更有效的测试检查非空白响应:

    if(typeof(colC[i][0]) =='string'){ ...
    

    更好的方法是确保C列中的值符合所需的格式要求。

  • 您正在使用if(colC[i][0] != ''){ ... 循环遍历数组,该循环用于遍历对象属性。这可行,但循环值for .. in将是一个字符串,这可能会导致数学时出现问题。最好养成循环数字索引的习惯。 (See)。

  • 全列范围表达式i很优雅,但最终会得到一个包含电子表格中所有行的数组,在您的示例中超过一千行。由于我们要遍历所有行,因此最好限制该范围:

    C2:C

针对这些问题进行调整,我们有:

var colC = sheet.getRange(2, 3, sheet.getLastRow()).getValues();  // C2:C, only non-blank rows