使用Google Apps脚本在电子表格中的一列中获取值

时间:2013-02-20 22:18:46

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

我希望获得一个字符串值 - 稍后将其与if条件进行比较 - 使用Google应用脚本从电子表格中的一列开始。 我搜索了互联网,发现了这个链接 - 抱歉,如果这听起来很愚蠢,我是谷歌应用脚​​本的新手 - https://developers.google.com/apps-script/class_spreadsheet

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

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

5 个答案:

答案 0 :(得分:35)

如果你简单地使用:

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

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

为了获得A列,第1行中的值,您使用values[0][0]values[1][0]用于columnA,第2行,values[0][2]用于列C row1,等等...

如果你需要迭代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
}

答案 1 :(得分:3)

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

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

values.forEach( function(row) {
  row[4] // column index as 4
});

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

解决方案 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)