如何将一系列单元格存储到数组中?
How can I store a range of cells to an array?
如果我在单元格 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())
}
试试这个:
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]);
}
变量数据存储A列的所有单元格。
单元格A1存储在数据[0][0]中,单元格A2存储在数据[0][1]中,单元格A3存储在数据[0][2]中,依此类推。
getRange(starting Row, starting column, number of rows, number of columns) 是一个批处理操作,所以当你有一个大数据集时它会快得多。
如果您只使用一列,我建议:
// 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) 去除空元素。上面的代码returns[A2,A3,A4,A5,A8,A9].
试试这个:
它将允许您 select sheet 上的任何列。
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
*
*/
}
如果中间没有空单元格,实际上很容易。
var lastRow = sheet.getLastRow();
var array = sheet.getRange('A1:A' + lastRow).getValues();
如果之后需要清除空条目,可以使用 for 语句,或者为了更快,像前面的答案所示那样进行过滤。
var filteredArray = array.filter(function(n){ return n != '' });
这个答案与我之前提到的那个答案之间的主要区别是 getValues() 会给你一个数组。
我已经测试过了,它在 google 应用程序脚本中工作,当我使用数组时它不会超时,甚至当我输入大量数据时(我用每个条目大约有 20-50 个字符和大约 500 个条目的数组)。只需确保定义变量 sheet 或放入您自己的变量即可。
如果我在单元格 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())
}
试试这个:
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]);
}
变量数据存储A列的所有单元格。
单元格A1存储在数据[0][0]中,单元格A2存储在数据[0][1]中,单元格A3存储在数据[0][2]中,依此类推。
getRange(starting Row, starting column, number of rows, number of columns) 是一个批处理操作,所以当你有一个大数据集时它会快得多。
如果您只使用一列,我建议:
// 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) 去除空元素。上面的代码returns[A2,A3,A4,A5,A8,A9].
试试这个:
它将允许您 select sheet 上的任何列。
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
*
*/
}
如果中间没有空单元格,实际上很容易。
var lastRow = sheet.getLastRow();
var array = sheet.getRange('A1:A' + lastRow).getValues();
如果之后需要清除空条目,可以使用 for 语句,或者为了更快,像前面的答案所示那样进行过滤。
var filteredArray = array.filter(function(n){ return n != '' });
这个答案与我之前提到的那个答案之间的主要区别是 getValues() 会给你一个数组。
我已经测试过了,它在 google 应用程序脚本中工作,当我使用数组时它不会超时,甚至当我输入大量数据时(我用每个条目大约有 20-50 个字符和大约 500 个条目的数组)。只需确保定义变量 sheet 或放入您自己的变量即可。