【问题标题】:Set formula for adjacent cell if text is present如果存在文本,则为相邻单元格设置公式
【发布时间】:2015-04-30 00:55:49
【问题描述】:

我正在使用 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 你可以看看。自定义菜单应在您打开时安装,您可以从那里(或从编辑器)运行脚本。

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    开始时有几个简单的错误。

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

    • 如果您使用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),"")')
        }
      }
    }
    

    【讨论】:

    • 感谢您提供如此详细的答案。我边走边自学,你指出的很多错误都是我在其他项目中做的事情,所以能够改进我正在做的其他事情真是太好了。我真的很感激。
    • 我想了很多,很高兴能帮上忙。 (这个问题已经有 2 个“最爱”,所以引起了人们的共鸣。)我很想了解更多关于 SMS 部分的信息,你有博文或链接可以教育吗?
    • 是的,我有草稿。我今天正在分析数据,然后我会用我正在使用的方法将一个帖子链接到这里。绝对是 hacky,但它确实有效。
    • 这是getting text messages into Google Sheets 的一篇文章。谷歌语音目前没有 API,所以有点乱,但效果很好。这篇文章的第二部分将于今天晚些时候发布(希望如此)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2017-04-10
    • 2018-11-21
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多