如果存在文本,则为相邻单元格设置公式
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),"")')
}
}
}
我正在使用 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),"")')
}
}
}