セル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())
}
1つの列のみを使用している場合は、次のことをお勧めします。
// my2DArrayFromRng = sh.getRange("A2:A10").getValues();
var my2DArrayFromRng = [["A2"],["A3"],["A4"],["A5"],[],[],["A8"],["A9"],[]];
var a = my2DArrayFromRng.join().split(',').filter(Boolean);
メソッド。join()と。split( '、')は一緒に、2D配列をプレーン配列(["A2"、 "A3"、 "A4" 、 "A5" , "A8"、 "A9"、])。次に、メソッド。filter(Boolean)は空の要素を取り除きます。上記のコードは[A2、A3、A4、A5、A8、A9]を返します。
これを試して:
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)はバッチ操作であるため、データセットが大きい場合ははるかに高速です。
これを試して:
シート上の任意の列を選択できます。
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()が配列を提供することです。
私はこれをテストしました、そしてそれはグーグルアプリスクリプトで動作します、そして私が配列を使うとき、あるいは私が大量のデータを入れたときでさえそれはタイムアウトしません(私はそれを約20-50文字の配列でテストしましたエントリと約500エントリ)。必ず変数シートを定義するか、独自の変数を入力してください。