2017-04-24 34 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 

這將返回第二行內的項目數。 你明白了。

希望此信息有幫助。