我的目标是根据联系人是否“出价”,将表单'callLog'中的联系信息复制并粘贴到另一张表。为了确定粘贴信息的位置,我从第一行工作表'meh'收集数据并将其放入数组中。 Vars rowGet和rowValues正在收集正确的信息,但是rowValues.length = 0.这导致以下for循环提前结束,并且每个值都粘贴在彼此之上。
请帮助我理解为什么数组长度为0,以及如何获得正确的值。
谢谢, -Chris
粘贴位置表设置:
+---+-----------+-----------+-----------+
| | A | B | x |
+---+-----------+-----------+-----------+
| 1 | Comp Name | ... | Comp Name |
+---+-----------+-----------+-----------+
| 2 | Cont Name | ... | Cont Name |
+---+-----------+-----------+-----------+
| 3 | Number | ... | Number |
+---+-----------+-----------+-----------+
| 4 | email | ... | email |
+---+-----------+-----------+-----------+
代码:
function distributeBidder() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('Call Log');
sheet.activate();
var range = spreadsheet.getRangeByName("bidList");
var copySheet = spreadsheet.getSheetByName('This Works');
// find the ones whose value is "BIDDING", and add them to a list of cells we need to hide
var vBidders = [];
for (var r = 1; r <= range.getNumRows(); r++) {
for (var c = 1; c <= range.getNumColumns(); c++) {
var cell = range.getCell(r, c);
if (cell.getValue() == "BIDDING") {
vBidders.push(cell);
}
}
}
copySheet.activate();
// Iterate through confirmed bidders and collect the correct data to paste
for(var i = 0;i<vBidders.length;i++){
var cCell = vBidders[i];
var compName = cCell.offset(0, +1);
var contName = cCell.offset(0, +2);
var contNum = cCell.offset(0, +3);
var contMail = cCell.offset(0, +5);
//THIS SCRIPT DOES NOT WORK WITH HORIZONTALLY FORMATTED DATA
var rowGet = copySheet.getRange("A1:H1");
var rowValues = rowGet.getValues();
//rowValues.length is coming up with a value of 0 breaking everything
for (var j = 0 ; j < rowValues.length ; j++) {
if(rowValues[j] == "Company Name") {
var rowValNow = j+1;
compName.copyValuesToRange(copySheet, rowValNow, rowValNow, 1, 1);
contName.copyValuesToRange(copySheet, rowValNow, rowValNow, 2, 2);
contNum.copyValuesToRange(copySheet, rowValNow, rowValNow, 3, 3);
contMail.copyValuesToRange(copySheet, rowValNow, rowValNow, 4, 4);
break;
};
};
};
};
链接以查看正在进行的电子表格:https://docs.google.com/spreadsheets/d/1AmdmQuw7OLH7v2LV-XQ_xW3hSPAHzi289Zt65bx53W8/edit?usp=sharing
答案 0 :(得分:2)
var rowGet = copySheet.getRange("A1:H1");
此处rowGet
获取值1,因为getRange(a1Notation)返回范围,而不是项目。
var rowValues = rowGet.getValues();
rowValues.length
不会返回rowValues中的项目数。它返回范围(行)的数量,即1。
如果范围为"A1:H2"
,则返回2。
如果范围为"A1:H3"
,则返回3。
你明白了。
要获得每行的实际长度,请知道它们是2d数组,因此您需要执行以下操作:
rowGet[0].length
这将返回第一行中的项目数。
rowGet[1].length
这将返回第二行中的项目数。 你明白了。
希望此信息有所帮助。
答案 1 :(得分:1)
这一行
var rowValues = rowGet.getValues()
将导致2D数组,或:一个数组,其中一个数组是唯一的元素。此内部数组将具有单元格A1:H1的值,并且将如下所示:
[[A1, B1, C1, D1, E1, F1, G1, H1]]
所以你通过rowValues的循环只会运行一次。 rowValues [j]是内部数组[A1,B1,C1,D1,E1,F1,G1,H1],永远不会与字符串匹配。目前尚不清楚公司名称在哪个单元格中,但假设它在A1中,您应该使用if语句,如下所示
rowValues[j][0] == "Company Name"
另一种方法是通过执行
直接遍历内部数组的列for (var j = 0 ; j < rowValues[0].length ; j++) {
if(rowValues[0][j] == "Company Name") {
当然,如果公司名称在指定的列中,您根本不需要循环,可以直接检查:
var rowValues = rowGet.getValues();
if(rowValues[0][0] == 'Company Name') { ....
希望有所帮助。