2017-04-24 61 views
0

我的目标是根据联系人是否“出价”,将工作表'callLog'中的联系人信息复制并粘贴到另一个工作表。为了确定粘贴信息的位置,我从第一行表格'meh'收集数据并将其放入数组中。 Vars rowGet和rowValues正在收集正确的信息,但是rowValues.length = 0.这导致以下for循环提前结束,并且每个值都被粘贴在一起。阵列的值与array.length = 0

请帮我理解为什么数组长度为0,以及如何获得正确的值。

感谢, 克里斯

粘贴位置表设置:

+---+-----------+-----------+-----------+ 
| |  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

回答

1

此行

var rowValues = rowGet.getValues() 

将产生一个二维数组,或:一个数组只有一个数组的数组。此内部阵列将单元格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') { .... 

希望帮助一点点。

+0

rowValues [0] .length和rowValues [0] [j]正是我所需要的。感谢您的帮助! –

+0

@ChrisMMgr:最欢迎! – JPV

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. 你的想法。

要获得各行的实际长度,知道他们是二维数组,所以你会做这样的事情:

rowGet[0].length 

这将返回的第一行中的项目数。

rowGet[1].length 

这将返回第二行内的项目数。 你明白了。

希望此信息有帮助。