【问题标题】:How can I store a range of cells to an array?如何将一系列单元格存储到数组中?
【发布时间】:2017-02-03 03:00:04
【问题描述】:

如果我在单元格 A1:A150 中有一个数据列表(但数量可能会有所不同),有没有办法将其推入数组而不单独查看每个单元格以确定它是否为空?这样做会超出我的执行时间,我需要一种更快的方法来存储数据并在遇到空单元格时停止。

以下是我目前的做法:

for (var i = 1; i < 500; i++) {
  if(datasheet.getRange("A" + i).getValue() == ""){
   break;   
  }

  else{
     addedlist_old.push(datasheet.getRange("A" + i).getValue())
    }

【问题讨论】:

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


    【解决方案1】:

    如果您只使用一列,我建议:

      // my2DArrayFromRng = sh.getRange("A2:A10").getValues();
      var my2DArrayFromRng = [["A2"],["A3"],["A4"],["A5"],[],[],["A8"],["A9"],[]];
      var a = my2DArrayFromRng.join().split(',').filter(Boolean);
    

    .join().split(',') 方法一起将二维数组转换为普通数组(["A2","A3", "A4","A5",,,"A8","A9",])。 然后方法 .filter(Boolean) 去除空元素。上面的代码返回 [A2, A3, A4, A5, A8, A9]。

    【讨论】:

    • 这有助于解决我从工作表列创建 HTML 选项列表的问题
    【解决方案2】:

    试试这个:

        var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
        var lastRow = sheet.getLastRow();
    
        var data = sheet.getRange(1, 1, lastRow, 1).getValues(); //getRange(starting Row, starting column, number of rows, number of columns)
    
        for(var i=0;i<(lastRow-1);i++)
        {
          Logger.log(data[0][i]);
        }
    

    变量data存储A列的所有单元格。

    单元格A1存储在data[0][0]中,单元格A2存储在data[0][1]中,单元格A3存储在data[0][2]中等等。

    getRange(starting Row,starting column, number of rows, number of columns) 是一个批处理操作,所以当你有一个大数据集时它会更快。

    【讨论】:

    • 如果我在其他单元格中有数据怎么办? lastRow var 不是不同的母鸡吗?我没有看到任何明确引用 a 列的内容。
    • 在您的问题中,您明确提到了 A1:A150 (仅 A 列)。此外,您最初尝试的代码仅适用于 A 列。
    • 每个单元格在自己的数组中的原因是它代表了整行。如果您可以设法在电子表格中转置您的数据,那么您的问题可能会得到解决。或者您可以做的是将 data[0] 存储在任何变量中...例如 var columnData 然后在 for 循环中您可以使用 columnData[ i] 而不是必须使用 data[0][i]
    • @SuyashGandhi - 您能否更新您的答案以合并 .getValues() 部分?它可以节省未来的寻求者的时间和痛苦。谢谢!
    • @somewhatsapient 感谢您提醒我。我进行了更改并在代码中合并了 .getValues() 方法。再次感谢您指出。希望对您有所帮助。
    【解决方案3】:

    如果您之间没有空单元格,这实际上很容易。

    var lastRow = sheet.getLastRow();
    var array = sheet.getRange('A1:A' + lastRow).getValues();
    

    如果之后需要清除空条目,可以使用 for 语句,或者为了更快,像之前的答案所示进行过滤。

    var filteredArray = array.filter(function(n){ return n != '' });
    

    这个答案和我之前提到的那个答案的主要区别在于 getValues() 会给你一个数组。

    我已经对此进行了测试,它在谷歌应用程序脚本中工作,当我使用数组时它不会超时,甚至当我输入大量数据时(我用一个大约 20-每个条目 50 个字符和大约 500 个条目)。只需确保定义 var 表或放入您自己的变量即可。

    【讨论】:

      【解决方案4】:

      试试这个:

      它将允许您选择工作表上的任何列。

      var ui = SpreadsheetApp.getUi();
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      
      function onOpen() {
      
        ui.createMenu('Sheet Functions')
       .addItem('Get values from column', 'getVals')
       .addToUi();    
       }
      
      function getVals() {
      var sheet = ss.getActiveSheet();
      var getColumnLetter = ui.prompt('Select column..' , 'Enter the letter of the target column..', ui.ButtonSet.OK_CANCEL);
        if(getColumnLetter.getSelectedButton() == ui.Button.CANCEL) { 
        return } else {
        getColumnLetter = getColumnLetter.getResponseText().toUpperCase();
        }
      
      var columnNo = getColumnLetter.charCodeAt(0) - 64;
      
      try { var data = sheet.getRange(1, columnNo, sheet.getMaxRows()).getValues().filter(String); } catch (e) { ui.alert('Invalid input please try again.', ui.ButtonSet.OK); return;}
      
      /*
      *
      * Do what ever you need to do down here
      *
      */
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 2015-04-22
        • 2018-07-21
        • 1970-01-01
        相关资源
        最近更新 更多