【发布时间】:2019-01-31 13:55:36
【问题描述】:
我想在这里实现的过程是将数据放入 2D 数组中,将其过滤掉,然后仅在过滤后的数组中抓取选定的列数据并将其推回同一 Google 工作表中的新选项卡中。每个过程都有注释,所以你可以按照我在做什么。
function copyToAndFrom() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s1 = ss.getSheetByName("PendingX");//sheet with imported data
var s2 = ss.getSheetByName("Resolved");//archive sheet
var lr = s2.getLastRow()+1;//get last row of archive sheet + 1
var dList = s1.getRange("PendingX!G2:G").getValues(); // Gets all the values of that specific column
var dLast = dList.filter(String).length; //Gets the length of dList.
var myArray = []; // A 2D array. I want a 12 column, dLast number of rows array.
myArray.length = dLast;
var tempArr = []; // Secondary array to get the filtered data from myArray array.
var filteredArr = []; // Get only specific data from tempArr array.
// myArray = s1.getRange('PendingX!D2:O').getValues();
// The the above comment is the original sheet import with 400+ rows but for testing, Ive disabled it and assigned manually as below.
myArray = [["Pending", , "abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwy", "xzz", "aaa"],
["Resolved", , "aabc", "adef", "aghi", "ajkl", "amno", "apqr", "astu", "avwy", "axzz", "aaaa"],
["Pending", , "babc", "bdef", "bghi", "bjkl", "bmno", "bpqr", "bstu", "bvwy", "bxzz", "baaa"]];
var myrowindex, myString, mycolumnindex;
tempArr[myrowindex] = [];
for (myrowindex in myArray) { //Loops through the number of rows in myArray.
myString = myArray[myrowindex][0];
if (myString === "Pending") {
for (mycolumnindex in myArray[myrowindex]) { //Loops through each column of a row in myArray.
var myColumnValue = myArray[myrowindex][mycolumnindex]; //Loads each component of myArray to a string.
tempArr[myrowindex].push(myColumnValue); //Push the string into the tempArr array.
}
myColumnValue = null;
myString = null;
}
}
for (myrowindex in tempArr){ //Load data from columns 0,3,10 and 11 into filteredArr array.
filteredArr.push(tempArr[myrowindex][0]);
filteredArr.push(tempArr[myrowindex][3]);
filteredArr.push(tempArr[myrowindex][11]);
filteredArr.push(tempArr[myrowindex][12]);
}
Logger.log(tempArr.length); // must be less than myArray.length but it is not.
Logger.log(tempArr[0].length); // must be equal to myArray[0].length but it is not.
Logger.log(tempArr); //Doesnt store data in a 2D Array but has to.
//CODE FOR STORING DATA TO SHEET:
for (var row in filteredArr) { //Loops through the number of rows in filteredArr.
for (var col in filteredArr[row]) { //Loops through each column of a row in filteredArr.
var myColumnValue = tempArr[row][col]; //Loads each component of filteredArr to a string.
final = s2.getRange(2,1,row,col).setValue(myColumnValue); //Push the string into the sheet.
}
}
}
最近更改后的错误:
TypeError:无法调用未定义的方法“push”。 (第 30 行,文件“CopyToFromScript”)
当前的日志输出和预期的日志输出:
tempArr.length 的当前记录器:
[19-02-01 19:25:08:933 IST] 22.0
tempArr.length 的预期记录器:
[19-02-01 19:25:08:933 IST] 2.0
tempArr[0].length 的当前记录器:
[19-02-01 19:25:08:934 IST] 12.0
tempArr[0].length 的预期记录器:
[19-02-01 19:25:08:933 IST] 12.0
tempArr 的当前记录器:
[19-02-01 19:25:08:935 IST] [Pending, abc, def, ghi, jkl, mno, pqr, stu, vwy, xzz, aaa, Pending, babc, bdef, bghi, bjkl, bmno, bpqr, bstu, bvwy, bxzz, baaa]
tempArr 的预期记录器:
[19-02-01 19:25:08:935 IST] [[Pending, abc, def, ghi, jkl, mno, pqr, stu, vwy, xzz, aaa], [Pending, babc, bdef, bghi, bjkl, bmno, bpqr, bstu, bvwy, bxzz, baaa]]
filteredArr 的当前记录器:
[19-02-01 19:24:35:773 IST] [P, d, null, null, a, null, null, null, d, null, null, null, g, null, null, null, j, null, null, null, m, null, null, null, p, null, null, null, s, null, null, null, v, null, null, null, x, null, null, null, a, null, null, null, P, d, null, null, b, c, null, null, b, f, null, null, b, i, null, null, b, l, null, null, b, o, null, null, b, r, null, null, b, u, null, null, b, y, null, null, b, z, null, null, b, a, null, null, null, null, null, null]
filteredArr 的预期记录器:
[19-02-01 19:24:35:773 IST] [[Pending, def, xzz, aaa], [Pending, bdef, bxzz, baaa]]
【问题讨论】:
-
你得到什么错误?上面的代码会产生什么输出?这些问题的答案将有助于其他人理解您的问题。
-
tempArr[myrowindex] = [12] 是一个数组,但 tempArr.push(myColumnData) 是来自 myArray 的值,因此 tempArr 是数组和单个值的混合
-
错误消息包括它出现的行。这个错误在哪里?帮助我们帮助您:stackoverflow.com/help/how-to-ask 另请注意,分配给索引意味着您可以使
tempArr“稀疏”。 -
我没有尝试测试您的代码,但有几处不正确 1) var myArray = [dLast][12];产生未定义的。您不能以这种方式调整数组大小。你可以说 var myArray = [];和 myArray.length = dLast;但是您仍然需要将每个数组和子数组初始化为大小 12。 2) tempArr[myrowindex] = [12];将在每个 myrowindex 中创建一个包含 1 个值 (12) 的数组。相反,您应该这样做 tempArr[myrowindex] = [];并将其移出 for 循环 3) 然后移入 for 循环 tempArr[myrowindex].push(myColumnData);
-
以前,问题是我没有得到任何错误,但结果不是我所期望的,并且用于将数据存储回电子表格的最终代码集没有任何作用。在这一点上,我不知道可能是什么问题。在实施 TheWizEd 建议的更改后,我在执行代码时遇到此错误:TypeError: Cannot call method "push" of undefined。 (第 30 行,文件“CopyToFromScript”)
标签: arrays google-apps-script google-sheets