【问题标题】:get value in one column in spreadsheet using google apps script使用谷歌应用脚​​本在电子表格的一列中获取值
【发布时间】:2013-02-20 22:18:46
【问题描述】:

我想使用 Google 应用程序脚本从电子表格中的一列中获取一个字符串值 - 稍后将其与 if 条件进行比较。 我在互联网上搜索并找到了这个链接 - 抱歉,如果这听起来很愚蠢,我是 Google 应用脚本的新手 - https://developers.google.com/apps-script/class_spreadsheet

var values = SpreadsheetApp.getActiveSheet().getRange(2, 3, 6, 4).getValues(); 

我想这一定很有帮助,唯一的问题是我要从中获取值的列是动态的,所以我该如何设置该列的范围

【问题讨论】:

    标签: javascript google-apps-script google-apps


    【解决方案1】:

    如果你简单地使用:

    var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues()

    您将获得工作表中按行和列索引的所有数据的二维数组。

    因此,要获取 A 列第 1 行中的值,您使用 values[0][0]values[1][0] 用于第 A 列,第 2 行,values[0][2] 用于 C 列第 1 行等...

    如果您需要在 for 循环中迭代(在单个列中):

    for(n=0;n<values.length;++n){
    var cell = values[n][x] ; // x is the index of the column starting from 0
    }
    

    如果您需要在 for 循环中迭代(在单行中):

    for(n=0;n<values[0].length;++n){
    var cell = values[x][n] ; // x is the index of the row starting from 0
    }
    

    【讨论】:

    • 这真的是一种有效的方法吗?检索整个数据范围然后只需要一列似乎太过分了。
    • 获取所有数据或仅获取列数据需要相同的时间,所以它真的没有任何区别:-) 您可以在记录所有执行时间的执行记录中轻松检查通过服务电话。
    • 这真的有助于我理解二维数组。谢谢
    • 性能差异很大。 getRange("A:A") 更快。
    【解决方案2】:

    这是我用来获取动态列中的值的脚本:

    var SS = SpreadsheetApp.getActiveSheet()
    var Avals = SS.getRange("A1:A").getValues();
    var numberOfValues = Avals.filter(String).length;
    var RangeVals = SS.getRange(1,1,numberOfValues).getValues();
    

    不过,我从来不需要根据动态变化的起点来更改起始行。有兴趣看看如何做到这一点。

    这是一个类似的post。 另一个例子here

    【讨论】:

      【解决方案3】:

      假设您希望使用getRange(a1Notation)A 中的所有行/单元格:

        var values = SpreadsheetApp.getActiveSheet().getRange("A:A").getValues();
      

      【讨论】:

        【解决方案4】:

        循环遍历行并获取列值的更简单方法..希望对您有所帮助

        var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
        
        values.forEach( function(row) {
          row[4] // column index as 4
        });
        

        【讨论】:

          【解决方案5】:

          这个答案下面提到的所有函数都会输出一个一维数组,我觉得操作起来会稍微方便一些。

          解决方案 1:

          获取列或行的另一种方式:

          function getColumn(activeSheet, columnIndex) {
            return activeSheet.getRange(1, columnIndex)
              .getDataRegion(SpreadsheetApp.Dimension.ROWS)
              .getValues()
              .flat();
          }
          
          function getRow(activeSheet, rowIndex) {
            return activeSheet.getRange(rowIndex, 1)
              .getDataRegion(SpreadsheetApp.Dimension.COLUMNS)
              .getValues()[0];
          }
          

          注意:这只会获取给定方向上相邻单元格中的数据。

          示例:1、2、3、空白、4、空白、5 ----- 4和5将被跳过。另外,请参阅getDataRegion(dimension)。如果数据区域内没有空单元格,这是一个理想的解决方案。

          解决方案 2:

          扩展@itazzad 的solution

          // JS object containing indices as keys and capital letters as value.
          const INDEX_ALPHABET = Array.from(new Array(26))
            .reduce((accumulatedObj, _, index) =>
              (accumulatedObj[index + 1] = String.fromCharCode(index + 65), accumulatedObj), {});
          
          // uses a1 notation
          function getColumn(activeSheet, columnIndex) {
            var columnA1Notation = INDEX_ALPHABET[columnIndex]
            return activeSheet.getRange(columnA1Notation + ':' + columnA1Notation)
              .getValues()
              .flat();
          }
          
          // uses a1 notation
          function getRow(activeSheet, rowIndex) {
            return activeSheet.getRange(rowIndex + ':' + rowIndex) 
              .getValues()[0];
          }
          

          getRange(a1Notation)。我不确定 R1C1 表示法和 A1 表示法是什么意思,但 this article 有点帮助。

          解决方案 3:

          如果您认为getValues() 可能是一个昂贵的调用并且随着Range 大小的增加而增加执行时间,那么请检查一下。基本上它会获取最后一行或最后一列,并使用它来减少Range 而不会省略任何相关数据。

          function getRow(activeSheet, rowIndex) {
            var lastColumn = activeSheet.getDataRange().getLastColumn()
            return activeSheet.getRange(rowIndex, 1, 1, lastColumn)
              .getValues()[0]
          }
          
          function getColumn(activeSheet, columnIndex) {
            var lastRow = activeSheet.getDataRange().getLastRow()
            return activeSheet.getRange(1, columnIndex, lastRow, 1)
              .getValues()
              .flat()
          }
          

          注意:如果您想获取行或列的切片,请查看getRange(row, column, numRows, numColumns)

          【讨论】:

            【解决方案6】:

            我认为这是迄今为止最好的答案。假设您想要列“D1:D”的值

            var numrows = SpreadsheetApp.getActiveSpreadsheet().getDataRange().getNumRows();
            var columnValues = sheet.getRange(1,4,numrows,1).getValues();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多