ひとり税理士のGAS -2.会計ソフトインポート用データを作成(3)-

前回のつづきです。

AスプシのXシートからBスプシのYシートにデータを移記するだけの単純な作業をプログラミング
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シートにデータを移記するだけの単純な作業のプログラム」を作成した・・・つもり。

 ですが、このままではエラーが発生するはず・・・。
 次回は、実際に動かしてみましょう。


いいなと思ったら応援しよう!