Google Apps Script 配列とgetValue(s)

Google Apps Script

こんにちは、ばばーるです。

スポンサーリンク

前回のおさらい

前回はfor文でセルの値を取得する方法をご紹介しました。

for(初期値; 条件式; 変化式){
 実行する式
}

for文の紹介の中で、たぬきさんがセルと配列の数えかたの違いで混乱すると言っていましたが、今回はその配列についてご紹介します。

配列とgetValue(s)

前回の<br>たぬきさん
前回の
たぬきさん

あっ!混乱している箇所がわかった!!!

セルのLrとはは1から数えはじめているのに、

ログ出力するときは0から数えはじめているところだ。

例えば、こんな感じのデータがスプレッドシート上に並んでいるとします。

function myFunction() {
  const ss=SpreadsheetApp.getActiveSheet();       //1行目
  const values=ss.getRange(1,1,3,3).getValues();  //2行目
  Logger.log(values);                             //3行目               
}

getRange()で(1行目、1列目のセルから、3行分、3列分)のデータの範囲を選んで、getValues()でセルの内容を取得します。
Logger.log()で出力すると、以下のようにセルの内容をログ表示できます。

この[ ]が配列と呼ばれます。

配列はプログラムで情報を記憶しておくための箱です。

Google Apps Script 6分の壁

Google Apps ScriptはGoogle社のサーバーで動いているので、サーバーに負荷がかかりすぎるプログラムは推奨されていません。そのため6分経過すると”ランタイムアウト”でスクリプトが停止します

例えば、スプレッドシートのセルに値を入力する、背景色をつける、セルの結合をするなどのスプレッドシート上の処理は時間がかかるため、スプレッドシートでアクセスせず、出来るだけ配列内で情報処理した上で、スプレッドシートのセルに結果を出力するのが好ましいです。

getValue(s)の使い方

今までgetValuesを使って、スクリプトの動きを説明してきましたが、今回はそのgetValuesとgetValueを説明します。

まずは、こんな感じのシートを用意します。

sheet

getRangeでセルの範囲を指定してからgetValue(s)を使用していきましょう。
(getRangeについてはこちらをご参照ください)

getValue: 範囲のセルの値を返します。値は、セルの値に応じて、数値、ブール値、日付、または文字列のタイプになります。空のセルは空の文字列を返します。

こんなスクリプトを書いてみましょう。

function myFunction() {
  const ss=SpreadsheetApp.getActiveSheet();  //1行目
  const value=ss.getRange(1,1).getValue();  //2行目
  Logger.log(value);                         //3行目
}

1行目でアクティブな(選択された)シートにアクセス
2行目でgetRange(1,1)でセルのA1を指定してその値をgetValue()で取得して
3行目でログ出力しています。

ログはA1を出力します。

このようにgetValueはそのセルの値を返します。

getValues(): 指定された範囲の(行列のインデックスが付きの)2次元配列を返します。
値は、セルの値に応じて、数値、ブール値、日付、または文字列のいずれかになります。空のセルは、配列内の空の文字列で表されます。
範囲インデックスは1、1から始まりますが、JavaScript配列は[0] [0]からインデックス付けされることに注意してください。

function myFunction() {
  const ss=SpreadsheetApp.getActiveSheet();       //1行目
  const values=ss.getRange(1,1,3,3).getValues();  //2行目
  Logger.log(values);                             //3行目
}

1行目でアクティブな(選択された)シートにアクセス
2行目でgetRange(1,1,3,3)でセルのA1~C3の範囲を指定して、セルの値をgetValues()で2次元配列として取得して
3行目でログ出力しています。

ログはA1~C3のセルの値を配列として出力します。

たぬきさん
たぬきさん

あえて言おう!

肝心の2次元配列とか、範囲インデックスとか、JavaScript配列とか

説明されていないと!!!

GAS
GAS

あっ…(たまにドヤ顔するな。)

今から説明します。

2次元配列はgetValuesのログの[[ ], [ ], [ ]]の様に表示された配列のことで、以下のイメージの通り、それぞれのセル値をJavaScript配列[行][列]インデックスで取得できます。

[[A1, B1, C1],      [[0][0],[0][1],[0][2],
 [A2, B2, C2],  <=>  [1][0],[1][1],[1][2],
 [A3, B3, C3]]       [2][0],[2][1],[2][2]] 

一方スプレッドシートのセルをgetRangeで取得する時の範囲インデックスはgetRange(1,1)がA1なので、スプレッドシートの対照表は以下の様になります。

GAS
GAS

つまり、

getValue(s)は0から数えはじめるけど、getRangeは1から数えはじめるから

混乱しないでねってことだよ。

たぬきさん
たぬきさん

あ〜なるほど。

わかった!

まとめ

配列とgetValue(s)について説明しました。

  • [ ]は配列
  • 計算はスプレッドシート上ではなく、出来るだけ配列を使ってプログラム内で処理する。
  • Google Apps Scriptは6分以上動かない
  • getValue(s)は0から数えはじめる
  • getRangeは1から数えはじめる

次回はsetValue(s)を説明します。setValueまで操作できるとスプレッドシート上でエクセルの様な処理までができる様になります。

タイトルとURLをコピーしました