我有一个包含多张工作表的电子表格,我希望得到一个数据范围,过滤数据并将过滤后数据的设定值转换为另一个工作表。 我可以使用.getvalues并通过该数组中的所有值循环,将我需要的数据推送到新数组,并将.setvalue(逐行)推送到新工作表。 我真正想要的是使用批量.setvalues来加速很多事情。 问题是当我将值推送到我的第二个数组时,我最终得到一个3D数组,而.setvalues只接受2D数组。 我一直在搜索并发现类似的问题(here,here),但我们的问题并没有得到解决方案。 我需要一个更快的解决方案,而不是逐行循环来设置值。
我的代码如下所示:
var shSales=ss.getSheetByName('Relação de Vendas'), lrowSales=shSales.getLastRow();
var shArchive=ss.getSheetByName('Hx Faturação')
var shSalesData=shSales.getRange(7,1,lrowSales-6,15).getValues();
var InvoicedSales=[];
var deleted=0;
for (var i in shSalesData) {
if (shSalesData[i][12]!=[] && shSalesData[i][13]!=[] && shSalesData[i][14]!=[]) {
InvoicedSales[i]=[];
InvoicedSales[i].push(shSalesData[i]);
shSales.deleteRow((parseInt(i)+7)-deleted);
deleted++;
}
}
var lrowArchive=shArchive.getLastRow();
var range=shArchive.getRange(lrowArchive+1, 1, 2, 15);
range.setValues(InvoicedSales);
SpreadsheetApp.flush();
你能帮我解决这个问题吗?
答案 0 :(得分:1)
从我看到你从头开始创建一个数组,所以你需要找到它转变成3D数组的位置,并通过使用适当的算法来构建你想要推送到电子表格的数组来阻止它。
通过快速调试,您可以发现问题确实发生在以下两行:
batch_rel.pluck(:id)
所以在第一行之后我们得到一个InvoicedSales[i]=[];
InvoicedSales[i].push(shSalesData[i]);
,在第二行之后你会得到InvoicedSales[[]]
,现在是一个3D数组。
正如我所提到的,对这个问题的简单解决方案是以不同的方式构造数组。这两行可以简单地替换为
InvoicedSales[[[data]]]
这样做的缺点是,如果您希望保留空格,则只需创建一个不反映不符合InvoicedSales.push(shSalesData[i]);
语句的数据的数组。为了在数组中还有空白行,您必须包含一个if
段,else
将一个空数组放入push
中,这样我们就会有以下几点:
InvoicedSales
因此,当for (var i in shSalesData) {
if (shSalesData[i][12]!=[] && shSalesData[i][13]!=[] && shSalesData[i][14]!=[]) {
InvoicedSales.push(shSalesData[i]);
shSales.deleteRow((parseInt(i)+7)-deleted);
deleted++;
}
else {
InvoicedSales.push([])
}
}
满足时,代码会将数据数组推送到InvoicedSales
,并在不满足if
时推送空数组。这样,如果第1行符合条件,则将其作为第1行推送,如果第3行符合下一条件,则在输出数组上它仍将是第3行。
请注意,通过这样做,然后使用if
所有空行将清除该特定行中的任何内容!因此,setValues()
会将电子表格值设置为
[[a,b,c],[],[1,2,3]]
中间的行是空白的,无论以前的单元格占用了什么