【问题标题】:Array with values coming up with array.length = 0带有值的数组,array.length = 0
【发布时间】:2017-04-24 19:35:20
【问题描述】:

我的目标是根据联系人是否为“投标”,将联系人信息从工作表“callLog”复制并粘贴到另一个工作表。为了确定将信息粘贴到何处,我从工作表“meh”的第一行收集数据并将其放入数组中。 Vars rowGet 和 rowValues 正在收集正确的信息,但 rowValues.length = 0。这导致以下 for 循环提前结束,并且每个值都粘贴在彼此之上。

请帮我理解为什么数组长度为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

【问题讨论】:

    标签: arrays google-apps-script google-sheets


    【解决方案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') { ....
    

    希望能有所帮助。

    【讨论】:

    • rowValues[0].length 和 rowValues[0][j] 正是我所需要的。感谢您的帮助!
    • @ChrisMMgr:最欢迎!
    【解决方案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
    

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

    希望这些信息对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2022-01-23
      • 2020-08-02
      • 2015-10-01
      相关资源
      最近更新 更多