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

Set formula for adjacent cell if text is present

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

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

我当前的脚本是:

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你可以看看。当您打开自定义菜单时应该会安装一个自定义菜单,您可以从那里(或从编辑器)运行 脚本。

感谢您的帮助。

开始时有一些简单的错误。

  • 电子表格单元格可以包含值或公式,但不能同时包含两者。

  • 如果您使用 setFormula/s(),单元格中的任何值都将被公式的结果替换,即使公式为空 .

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

    // 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),"")')
    
  • 条件测试不充分。空白单元格仍然是字符串类型,但它是一个空白字符串。所以这对表单条目和 SMS 条目的评估都是正确的:

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

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

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

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

  • 您正在使用 for .. in 循环遍历数组,这意味着遍历对象属性。这行得通,但是循环值 i 将是一个字符串,这在进行数学计算时可能会出现问题。最好养成循环数字索引的习惯。 (See.)

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

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

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

function splitCells2() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var colC = sheet.getRange(2, 3, sheet.getLastRow()).getValues();  // C2:C, only non-blank rows
  //Logger.log(colC);
  for(var i=0; i< colC.length; i++){
    if(colC[i][0] != ''){
      // 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),"")')
    }
  }
}