ひとり税理士のGAS -2.会計ソフトインポート用データを作成(3)-
前回のつづきです。
var Asheet=SpreadsheetApp.openById(' [スプレッドシートID] '); // [スプレッドシートID]で取得
var Bsheet=SpreadsheetApp.getActiveSpreadsheet(); // 現在使用しているものを取得
var Asheet_X = Asheet.getSheetByName('X');
var Bsheet_Y = Bsheet.getSheetByName('Y');
for( var i=1; i <= 2 ; i++ ){
for( var j=1; j <= 3 ; j++ ){
var vmoto = Asheet_X.getRange( i , j ).getValue();
Bsheet_Y.getRange( i , j ).setValue(vmoto);
}
}
以上、前回の復習。
今回は、少しでも処理時間が短くなるように改良したいと思います。
「配列」というものを使います。
上のコードだと、ワークシートの読み書き・・・下図の線の数分必要になれますが、
次のイメージのように、変更したいと思います。
赤の矢印部分がワークシートの読み書きの数です。セルの数が多くなればなるほど、まとめて読み書きする時間は遅くなりますが、個々に処理するよりは早くなります。
上図の「まとめて取得」するには、
var Asheet_X_Value = Asheet_X.getDataRange().getValues();
で、「Asheet」スプシの「X」シートのすべての値を取得して、「Asheet_X_Value」という変数に代入することになります。
var Asheet_X_Value = Asheet_X.getRange(1,1,2,3).getValues();
で、「X」シートの「1」行目の「1」列目(A1セル)を基点にして2行分かつ3列分取得して、「Asheet_X_Value」という変数に代入することになります。
上の「getValues」で取得した各セルの配列は、↓のように表現できます。
なお、配列は、「0,1,2,・・・」とカウントされます。
取得するセルの数は、少ない方が早く処理できるので、「getRange(1,1,2,3)」のように範囲を絞った方が良いと思います。
次に、処理した値を受け入れる配列変数を用意します。
入れる前に、配列変数は空にします→→→「 [ ] 」
var array_r = [] ; // 行の値を入れる配列変数を用意します
var array_c = [] ; // 列の値を入れる配列変数を用意します
用意した配列変数に値を入れるには、「push」を使います。
var array_r = [] ; // 行の値を入れる配列変数を用意します
var = [] ;列の値を入れる配列変数を用意します
array_c.push(xxx) ; // array_cに「xxx」を入力
array_r.push(array_c) ; // array_rに array_c を入力
配列変数の値をまとめてワークシートに貼り付けるのは、
Bsheet_Y.getRange(1, 1,array_r.length,array_r[0].length ).setValues( array_r );
・・・配列変数array_rの値を「Bsheet」スプシの「A1」セルを基点にarray_r の数分の行と array_r[0](最初の行)の数分の列の範囲に貼り付けます・・・と。
以上、整理すると、
var Asheet=SpreadsheetApp.openById(' [スプレッドシートID] '); // [スプレッドシートID]で取得
var Bsheet=SpreadsheetApp.getActiveSpreadsheet(); // 現在使用しているものを取得
var Asheet_X = Asheet.getSheetByName('X');
var Bsheet_Y = Bsheet.getSheetByName('Y');
var Asheet_X_Value = Asheet_X.getRange(1,1,2,3).getValues();
var array_r = [];
for( var i=1; i < Asheet_X_Value.length ; i++ ){
var array_c = []; // ここで、array_c を空にしないと・・・
for( var j=1; j <= Asheet_X_Value[0].length ; j++ ){
array_c.push( Asheet_X_Value[i][j] ) ;
}
array_r.push( array_c ) ;
}
Bsheet_Y.getRange(1, 1,array_r.length,array_r[0].length ).setValues( array_r );
一応、「AスプシのXシートからBスプシのYシートにデータを移記するだけの単純な作業のプログラム」を作成した・・・つもり。
ですが、このままではエラーが発生するはず・・・。
次回は、実際に動かしてみましょう。