我试图弄清楚如何使用Google Apps脚本仅提取特定的行和列。不能使用= QUERY选项。需要将所有逻辑都保留在脚本中-我的实际数据集非常大。为了说明我要解决的问题。我有一张测试数据表。 TestData我只希望从中获得第2、3、5列(从零开始的索引),并且只需要带有“ fur”的行。
function testFour(sheetID, fromTabName, toTabName) {
var sourceTab = SpreadsheetApp.openById(sheetID).getSheetByName(fromTabName);
var values = sourceTab.getDataRange().getValues();
var columns = [2,3,5]; //only want these columns
var output = new Array();
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values[0].length; j++) {
if (values[i][4] == "fur") { // only want these rows
if (j in columns) {
output.push(values[i][j]);
}
}
}
}
var targetTab = SpreadsheetApp.openById(sheetID).getSheetByName(toTabName);
targetTab.getRange(1, 1, output.length, columns.length).setValues(output);
}
此代码位有效,但如果有很多列,则维护性很差:
for(n=0; n < values.length; ++n) {
var columns = [2,3,5];
if (values[n][4] === 'fur') {
output.push( [values[n][2], values[n][3], values[n][5]]);
}
当我运行testFour函数时,在此代码行上出现有关“无法将数组隐蔽到对象[] []的错误:
targetTab.getRange(1, 1, output.length, columns.length).setValues(output);
感谢任何帮助。我真的很惊讶,没有找到任何这样的例子。每个解决方案都使用工作表上的= QUERY。
答案 0 :(得分:0)
编辑:
如果使用此行推送到输出,则不需要[]
周围的output
-
output.push( [values[n][2], values[n][3], values[n][5]]);
要按行设置值,数据必须采用这种格式-
[ row,
row ]
或
[ [1,2,3],
[4,5,6] ]
当范围和值格式不匹配时,显示 Cannot covert Array to Object[][]
错误。
尝试此行-
targetTab.getRange(1, 1, output.length, columns.length).setValues([output]);
答案 1 :(得分:0)
我猜您要使用此功能从同一数据集中构建不同的报告。所以我可以尝试这样的事情:
功能:
function testFour(t4Obj) {
var ss=SpreadsheetApp.openById(t4Obj.ssId);
var srcsh=ss.getSheetByName(t4Obj.srcShName);
var dessh=ss.getSheetByName(t4Obj.desShName);
var colA=String(t4Obj.zbcols).split('~~~');
var tstCol=Number(t4Obj.zbtstCol);
var tstVal=t4Obj.tstVal;
var srcrg=srchsh.getDataRange();
var srcvA=srcrg.getValues();
var desvA=[];
for (var i=0;i<srcvA.length;i++) {
var tA=[];
if (srcVa[i][tstCol]==tstVal) {
for (var j=0;j<colA.length;j++) {
tA.push(colA[j]);
}
desvA.push(tA);
}
}
dessh.getRange(1, 1, desvA.length, desvA[0].length).setValues(desvA);
}
t4Obj数据表:
当然,您必须自己构建一个函数,以从上表中加载t4Obj。通过查看您的代码,我猜对您来说这没问题。
请注意,我尚未测试任何此代码,因此极不可能首次使用。您可以提高调试技巧。
让我们尝试制作一个正方形范围的数组,其中数字在每一行的同一列位置按1递增。数组如下所示:
var A=[[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24][5,10,15,20,25]];
手工制作阵列
function makeArray() {
var A=[[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24],[5,10,15,20,25]];
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getRange(5,5,5,5);//could be this way
//var rg=sh.getRange(5,5,A.length,A[0].length);//or in most programs this way
rg.setValues(A);
}
答案 2 :(得分:0)
基于库珀的建议,这就是我如何使它工作的方法:
function testFourNew(sheetID, fromTabName, toTabName) {
var sourceTab = SpreadsheetApp.openById(sheetID).getSheetByName(fromTabName);
var targetTab = SpreadsheetApp.openById(sheetID).getSheetByName(toTabName);
var srcrg = sourceTab.getDataRange();
var srcvA = srcrg.getValues();
var desvA=[];
// var columns = [2,3,5]; //only want these columns
var columns = String("2,3,5").split(','); //only want these columns
var tstVal = "fur";
var tstCol = 4;
for (var i=0;i<srcvA.length;i++) {
var tA=[];
if (srcvA[i][tstCol] ==tstVal) {
for (var j=0;j<columns.length;j++) {
//Logger.log(srcvA[i][columns[j]]);
tA.push(srcvA[i][columns[j]]);
}
desvA.push(tA);
}
}
targetTab.getRange(1, 1, desvA.length, desvA[0].length).setValues(desvA);
}
谢谢库珀的指导和建议!