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