我不熟悉使用Google Apps脚本进行编码,并且正在尝试为电子表格创建一个简单的案例检查器。
在这种情况下,我想检查名称的首字母是否大写,如果不是,我想用更正的版本(相同的名称,仅将首字母大写)替换。
尝试在编辑器中运行该代码时将返回错误(无法读取未定义的属性“ range”。)我猜这是因为它使用的是onFormSubmit触发器,因此测试它的唯一方法是实际提交表单响应。
发布新的表单响应并触发该功能后,它似乎在电子表格的末尾没有任何作用。包含名字和姓氏的新单元格(或与此有关的任何新单元格)都不会更改,无论是否用大写字母大写。
当使用以相同方式引用单元格的单独函数(获取一系列新提交的单元格并在for循环中将它们指定为row [numberhere])时,它会很好地读取其字符串。
function caseCheck(r) {
var range = r.range;
var data1 = range.getValue();
for (var r in data1) {
var row1 = data1[r];
var firstName = row1[2].getValue;
var lastName = row1[3].getValue;
var firstNameC = firstName[0].toUpperCase();
var lastNameC = lastName[0].toUpperCase();
if (firstName[0] != firstNameC) {
var firstNameL = firstName.length();
var firstNameSS = firstName.substring(1,firstNameL);
var firstNameCorrected = firstNameC + firstNameSS;
row1[2].setValue(firstNameCorrected);
}
if (lastName[0] != lastNameC) {
var lastNameL = lastName.length();
var lastNameSS = lastName.substring(1,lastNameL);
var lastNameCorrected = lastNameC + lastNameSS;
row1[3].setValue(lastNameCorrected);
}
}
}
如图所示,您的代码有几个问题。
我想你的意思是要用复数range.getValues()
不range.getValue()
作为.getValue
仅返回范围的左上角单元格内的对象。如果data1
是字符串,则for (var r in data1)
仅循环遍历字符串,而不是值数组。
假设您已修复data1
它是一个数组数组,那么row1
它只是一个JavaScript数组,大概是一个字符串数组,因此您正在使用的各个位置row1[2].getValue
(例如,它们都没有括号)并且row1[2].setValue(firstNameCorrected)
应该没有任何作用因为这些是字符串,而不是Range
对象。
您需要做的是根据需要更改数据数组,然后range.setValues(data)
使用更改后的数据进行调用。
function caseCheck(r) {
var range = r.range;
var data = range.getValues();
for (var r in data) {
var row = data[r];
// do whatever mutation to row you want
}
range.setValues(data);
}
附带说明一下,个人喜好/建议,这种命令式的变异代码很难阅读和维护。考虑使用更多(或更小的)功能...
function caseCheck(r) {
var range = r.range;
var data = range.getValues();
var newData = data.map(rowCapitalizeFunction);
range.setValues(newData);
}
function rowCapitalizeFunction(row) {
var firstName = row[2];
// etc ... do what you need to do
return [/* send back a new array with new values, much easier to understand! */];
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句