36

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

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

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

4

6 回答 6

56

如果您简单地使用:

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

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

因此,要获取 A 列中的值,您使用的第 1 行values[0][0],对于 A 列values[1][0],第 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
}
于 2013-02-20T22:37:12.087 回答
9

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

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();

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

这是一个类似的帖子。另一个例子在这里

于 2018-11-13T00:16:18.023 回答
7

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

  var values = SpreadsheetApp.getActiveSheet().getRange("A:A").getValues();
于 2021-03-12T05:36:15.777 回答
4

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

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

values.forEach( function(row) {
  row[4] // column index as 4
});
于 2018-05-06T16:53:45.850 回答
1

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

解决方案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, blank, 4, blank, 5 ----- 4 和 5 将被跳过。另外,请参阅getDataRegion(dimension)。如果数据区域内没有空单元格,这是一个理想的解决方案。

解决方案2:

扩展@itazzad 的解决方案

// 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 表示法是什么意思,但这篇文章有点帮助。

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

于 2021-07-05T11:15:37.493 回答
0

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

var numrows = SpreadsheetApp.getActiveSpreadsheet().getDataRange().getNumRows();
var columnValues = sheet.getRange(1,4,numrows,1).getValues();
于 2021-09-03T09:30:16.233 回答