当使用onFormSubmit触发器给定范围时,如何写入单元格?(谷歌应用程序脚本)



我刚开始使用谷歌应用程序脚本进行编码,正在尝试为我的电子表格制作一个简单的案例检查器。

在这种情况下,我想检查一个名字的第一个字母是否大写,如果不是,我想用更正的版本(相同的名字,只是第一个字母大写。(

当试图在编辑器中运行此代码时,此代码返回一个错误(无法读取未定义的属性"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只是返回范围左上角单元格内的Object。如果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! */];
}

最新更新