摘要:谷歌应用程序脚本中的(工作表的v8),我尝试将数组元素从一个数组中分割出来,并将其推入另一个数组中。数组将是[ [] [] [] ],但我越来越像[ [] [[]] [[]] ]了。这(我认为)是在使用它来获取changes / setvalues (长度从getrange更改为setvalue)时创建的后面的问题。我会把这些问题分开,但我不知道它们是否相关。
这对我来说似乎很多,但是当发布一个简短的答案时,我被要求提供可重复的代码,所以这是更长的时间。
Issue1:意外嵌套的数组
想要的outcome1:单嵌套(适合粘贴到google )。
Issue2:在尝试获取range /setValue时,get范围内的data.length与同一行代码中setValues(数据)所需的列不匹配。
所需的outcome2: getRange data.length = setValues数据长度用于getRange和setValues (列)
代码:关于代码的信息(不能放在下面,否则它会出错):函数tester2确实推送/切片,并将变异数组作为对象返回。函数tester1提取返回的对象并记录两个数组。(不确定这是否相关,但它是较大代码的一部分)。日志低于“代码”。
function tester2(){
var arrnew = tester();
llog(arrnew.r1);
llog(arrnew.r1.length);
llog(arrnew.r1[0].length);
llog(arrnew.r2);
llog(arrnew.r2.length);
llog(arrnew.r2[0].length);
var sh = SpreadsheetApp.getActive().getSheetByName('temp');
sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);
sh.getRange(1,1,arrnew.r2.length,arrnew.r2[0].length).setValues(arrnew.r2);
}
function tester(){
var arr1 = [[1,2,3],[4,5,6],[7,8,9],[112,211,311],[411,511,611],[711,811,911]];
var arr2 = [[11,12,13],[14,15,16],[17,18,19]];
var arr3 = [['hdr1','hdr2','hdr3']];
for (var r=1;r<arr1.length;r++){
if(arr1[r][0] % 2 == 0) {
arr3.push(arr1.splice(1,1));
}
}
var rtn = {r1: arr1, r2: arr3};
return rtn;
}日志:
上面的日志是在一起的,为了便于匹配。(这不是代码,但我一直收到“缩进您的代码”错误.
>[20-11-11 19:50:47:811 EST] [[1.0, 2.0, 3.0], [112.0, 211.0, 311.0], [411.0, 511.0, 611.0], [711.0, 811.0, 911.0]]
>
>[20-11-11 19:50:47:815 EST] 4.0
>
>[20-11-11 19:50:47:818 EST] 3.0
>
>[20-11-11 19:50:47:821 EST] [[hdr1, hdr2, hdr3], [[4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0]]] *** notice double-nesting
>
>[20-11-11 19:50:47:823 EST] 3.0
>
>[20-11-11 19:50:47:826 EST] 3.0
>
>[20-11-11 19:50:48:240 EST] Exception: The number of columns in the data does not match the number of columns in the range. The data has 1 but the range has 3. at tester2(dcmv1:229:55)
>*** code line 229 begins: sh.getRange(1,1,arrnew.r1发布于 2020-11-12 02:06:14
解释:
问题确实是第二项和第三项内容中的两个括号。第二个和第三个元素具有[[]]的结构,因此它们的长度是1而不是3,就像第一个元素的情况一样。您可以看到,如果您执行Logger.log(arrnew.r2[1].length),您将得到1,因为在方括号[[]]中只有一个元素[]。但是第一个括号中有3元素hdr1, hdr2, hdr3,因此Logger.log(arrnew.r2[0].length)返回3。
我不知道您想要实现什么,但是您可以通过引入一个具有正确格式的新数组来“修复”这个问题:
data2 = [arrnew.r2[0],...arrnew.r2[1],...arrnew.r2[2]]
用它代替arrnew.r2。
可行的例子:
function tester2(){
var arrnew = tester();
data2 = [arrnew.r2[0],...arrnew.r2[1],...arrnew.r2[2]]
var sh = SpreadsheetApp.getActive().getSheetByName('temp');
sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);
sh.getRange(1,1,arrnew.r2.length,arrnew.r2[0].length).setValues(data2);
}
function tester(){
var arr1 = [[1,2,3],[4,5,6],[7,8,9],[112,211,311],[411,511,611],[711,811,911]];
var arr2 = [[11,12,13],[14,15,16],[17,18,19]];
var arr3 = [['hdr1','hdr2','hdr3']];
for (var r=1;r<arr1.length;r++){
if(arr1[r][0] % 2 == 0) {
arr3.push(arr1.splice(1,1));
}
}
var rtn = {r1: arr1, r2: arr3};
return rtn;
}发布于 2020-11-13 01:49:14
马里奥斯给出了一个很好的答案,为具体的例子提供了一个解决办法。我在这里回答这两个问题,我有一些额外的细节。
问题1:为什么我会在下面的表达式中得到长度不匹配的异常setValues(数据)和getRange(列)?
sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);答案1:我有一个锯齿状数组,即r1 != r11。
问题2:如何阻止下面的表达式创建交错数组?
arr3.push(arr1.splice(1,1));答案2:只获取剪接的第一个元素以返回[],而不是[[]]。
arr3.push(arr1.splice(1,1)[0]);来自Marios的额外洞察力:叫做扩展语法,有点像工作表中的‘array式()’函数。
https://stackoverflow.com/questions/64796597
复制相似问题