[英]How to copy specific rows from 3 google spreadsheet to another spreadsheet using google apps script
[英]Google apps script select specific rows with specific columns
我试图弄清楚如何使用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。
编辑:
不需要[]
周围的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]);
我猜您想使用此功能从同一数据集中构建不同的报告。 所以我可以尝试这样的事情:
功能:
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);
}
基于以上库珀的建议,这就是我如何使它起作用的方式:
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);
}
谢谢库珀的指导和建议!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.