var ss = SpreadsheetApp.getActiveSpreadsheet();var sh = ss.getActiveSheet();var ary = []; 次に、配列に格納した値を要素数を指定しながらスプレッドシートの右隣りに貼り付けてみます。 下記のサンプル4では、, で変数iの初期値を0とし、ary.lengthで配列変数aryの要素数を取得し(今回は5の数値が取得されます)、変数iがary.lengthより小さい間は処理を繰り返します。. Google Apps Script(以下GAS)上で配列、連想配列を扱う際の記述方法について纏めてみます。・・・と言ってもGAS自体がJavaScriptベースなので、「JavaScriptにおける書き方」でも意味は同じだと思い … 前回は「for」文、「while」文による「繰り返し(ループ)」処理についてお伝えしました。, そして、GASのための「JavaScript」シリーズ第5弾は、「配列」と「オブジェクト」です。, これまでは1つのデータを「変数」に代入して使用していましたが、データが「複数」になると1つ1つ変数に代入して使用していくのは効率的とは言えません。, そのような場合に便利なものが「配列」と「オブジェクト」です。配列やオブジェクトを使えば複数の値も変数1つで扱うことができます。, また、GASでは特に「配列」の扱いが非常に大事になってきます。なぜなら、GASでは1回あたりの処理時間に制限(6分)があり、「配列」を利用して値を一気に取得したり書き込んだりすることで処理スピードを格段に向上させることができるからです。, 「配列」は内容が盛り沢山となりますので、途中で休憩しながら読み進めていただければと思います。, 【GAS】JavaScript基本① 〜 基本的な「書き方」や「変数」を理解しよう
前回Google Apps Script (GAS) で一次元配列の要素を追加・削除する方法をGIF動画付きで解説しました。 www.yukibnb.com, 今回はその応用として二次元配列の要素を追加・削除する方法をサンプルやGIF動画を使ってやさしく解説します。, 「一次元配列と二次元配列の違いって?」、「一次元配列の要素を追加・削除する方法って?」という方はまず上記ふたつの記事をささっとお読み頂くことをおすすめします。, 『priceListにはレモン、オレンジ、桃の料金が掲載されている。この表にリンゴの料金も掲載したい』という場合、一次元配列["apple", "JPY250"]を追加する必要があります。, これが「二次元配列内の一次元配列を丸々操作する」ということです。行を追加するイメージです。, 次に『priceListにはレモン、オレンジ、桃の料金が掲載されている。料金以外に産地も掲載したい』という場合、["orange","JPY150"]に産地を追加して["orange","JPY150","Brazil"]とする必要があります。, これが「二次元配列内の一次元配列の中の値を操作する」ということです。列を追加するイメージです。, 括弧内に一次元配列["apple", "JPY250"]を入力することで、二次元配列priceListの先頭に一次元配列["apple", "JPY250"]を追加しました。, 括弧内に一次元配列["apple", "JPY250"]を入力することで、二次元配列priceListの末尾に一次元配列["apple", "JPY250"]を追加しました。, 二次元配列priceListの先頭の一次元配列["lemon","JPY100"]を削除しました。, 二次元配列priceListの末尾の一次元配列["peach","JPY200"]を削除しました。, 二次元配列の中の一次元配列はpriceList[インデックス番号]で指定できます。, 例えば["orange","JPY150"]を指定したい場合、priceList[1]と書けばOKです。, そして["orange","JPY150"]の先頭に値を追加したい場合、priceList[1].unshift(値)と書きます。, priceListのインデックス番号1、["orange","JPY150"]の先頭に産地の"Brazil"を追加しました。, priceListのインデックス番号1、["orange","JPY150"]の末尾に産地の"Brazil"を追加しました。, priceListのインデックス番号1、["orange","JPY150"]の先頭の要素"orange"を削除しました。, priceListのインデックス番号1、["orange","JPY150"]の末尾の要素"JPY150"を削除しました。, 今回解説した方法にfor文などのループを組み合わせると、スプレッドシートを高速で操作できるようになります。, 当ブログでは民泊運営や様々な業務を自動化・効率化するための情報を紹介しています。Twitterで最新記事や人気記事をお知らせしていますので、是非フォローお願いします!, 海外製SaaSの日本事業をしています。縁あって全く異なる民泊業界にも2016年から関わっています。民泊業務や各種業務を自動化・効率化するためのブログを執筆しています。お気軽にコメント・お問い合わせください :), 業務効率化とおもてなし力アップを同時にするために、外国から来るお客様向けに各種家電用の英語シールを作りました。↓↓↓, 民泊向けのオリジナル地図(アクセスマップ)作成のご依頼はこちらからお願いします。↓↓↓, 海外製SaaSの日本事業をしています。縁あって全く異なる民泊業界にも2016年から関わっています。民泊業務や各種業務を自動化・効率化するためのブログを執筆しています。, こんにちは! Yuki (@yukibnb) です。今回はGoogle Apps Script…, こんにちは! Yuki (@yukibnb) です。LINE Messaging APIとGoog…, こんにちは! Yuki (@yukibnb) です。Google Apps Script (GAS)…, 2020-10-31こんにちは! Yuki (@yukibnb) です。前回はGoogle A…, //ログ⇒[["apple","JPY250"],["lemon","JPY100"],["orange","JPY150"],["peach","JPY200"]], //ログ⇒[["lemon","JPY100"],["orange","JPY150"],["peach","JPY200"],["apple","JPY250"]], //ログ⇒[["orange","JPY150"],["peach","JPY200"]], //ログ⇒[["lemon","JPY100"],["orange","JPY150"]], //二次元配列のインデックス番号1、["orange","JPY150"]の先頭に要素を追加する, //ログ⇒[["lemon","JPY100"],["Brazil","orange","JPY150"],["peach","JPY200"]], //二次元配列のインデックス番号1、["orange","JPY150"]の末尾に要素を追加する, //ログ⇒[["lemon","JPY100"],["orange","JPY150","Brazil"],["peach","JPY200"]], //二次元配列のインデックス番号1、["orange","JPY150"]の先頭の要素"orange"を削除する, //ログ⇒[["lemon","JPY100"],["JPY150"],["peach","JPY200"]], //二次元配列のインデックス番号1、["orange","JPY150"]の末尾の要素"JPY150"を削除する, //ログ⇒[["lemon","JPY100"],["orange"],["peach","JPY200"]], 【応用編第3話】コピペでOK!スプレッドシートを使ってLINE BOTにスタンプや画像を返信させる方…. [0, 5]のような配列の形ではなく、(0, 5)の形で( )の中に数字を入れて追加します。, それでは今度は「削除」する方法を見ていきましょう。 先ほどもお伝えしましたが、プロパティがあることで値がどのような意味なのかわかりやすいですね。, そして、次の章でも説明しますが、配列は「インデックス」を「キー」として、オブジェクトは「プロパティ」を「キー」として箱の中にある値を取り出したり、逆に新しく値を入れたりすることを行います。, それぞれの値にアクセスするには「プロパティ(キー)」を使って次のように記述します。 配列を利用することで値を一気に取得したり書き込んだりでき、処理スピードを格段に向上させることができます。, データ量が大きくなればなるほどその恩恵を得られると思います。今回は概要のみの説明になりますので、実際の使用方法はまた別の機会にお伝えできればと思います。, 「一次元配列」では、「 配列名[インデックス] 」という形で「インデックス」を「キー」として値を取得することができましたね。, それでは、スプレッドシートの「C2」の値を「二次元配列」の状態から取得するにはどのように記述すれば良いでしょうか。
この「4」という数字は、配列の「要素数」と同じですね。要素数を出力するものは上記でも説明した「length」プロパティがありました。, この書き方であれば、要素数が5個でも10個でも増えても何も変更する必要はないですね。 まだ理解が不十分の場合は、先に「オブジェクト」を学ぶと良いと思います。「オブジェクト」は基本のみ説明しています。, まずは「追加」からです。「先頭」に値を追加する場合は「unshift()」、「末尾」に値を追加する場合は「push()」を使います。 これは、インデックスの「1」番目を「開始位置」として、そこから「2つ」分を削除するという意味になります。, 実際に実行してみましょう。「20」と「30」が削除され、「10」と「40」の2つが残りましたね。, 続いて、残った2つの値の配列の間に「25」と「35」の2つの値を入れてみましょう。 実は「splice()」という便利なメソッドが用意されています。, splice ( 変化を開始するインデックスの位置,  削除数,  追加する値①,  追加する値②, ... ), 少し分かりにくいので今回もこちらの配列(numbers)を使って見ていきましょう。, 「splice(1, 2)」を実行したらどのような結果になるでしょうか。 © 2020 zak-papa All rights reserved. 「先頭」の値を削除する場合は「shift()」、「末尾」の値を削除する場合は「pop()」を使います。( )の中は何も記述せずに使用します。, なお、値の「削除」は先頭と末尾のそれぞれ「1つ」のみになります。では、先ほどの例文に続けて記述してみましょう。, 今回お伝えした4つのメソッドは、配列の要素数を数えなくても「自動」で先頭と末尾に対して処理を実行してくれる便利なものです。 var ss = SpreadsheetApp.getActiveSpreadsheet(); sh.getRange(1 + i, 4).setValue(ary[i][0]); sh.getRange(1 + i, 5).setValue(ary[i][1]); sh.getRange(1 + i, 6).setValue(ary[i][2]). 開始位置は「10」の次、つまりインデックスが「1」ですね。そして今回は削除する値がないので「0」、その後に追加したい値を続けて記述します。, では最後に元の配列の状態に戻して終わりましょう。先ほど追加した「25」と「35」を削除して、「20」と「30」を追加すればいいですね。 ※「C2」を1つのセルとして取得する簡単な方法はありますが、今回は「二次元配列」から要素を取得する方法をお伝えしています。, 先ほどの「箱」のイメージで見てみましょう。 【GAS】JavaScript基本③ 〜 if文、switch文で「条件分岐」をしてみよう 続いて、「二次元配列」の各要素にアクセスする方法を見ていきましょう。 「一次元配列」では、「 配列名[インデックス] 」という形で「インデックス」を「キー」として値を取得することができましたね。 「i < 3」を「i < 4」に変更すれば確かに出力はできますが...。, ただ、この場合だとさらに要素の数が増えた場合に毎回手直しが必要になり、手間が発生してしまいます。, そこで、この「4」という数字に着目してみましょう。 var ary = sh.getRange(1, 1, last_row, 3).getValues(); var ss = SpreadsheetApp.getActiveSpreadsheet();var sh = ss.getActiveSheet();var last_row = sh.getLastRow(); [[A1, B1, C1], [A2, B2, C2], [A3, B3, C3], [A4, B4, C4], [A5, B5, C5]], スプレッドシートに記載されているデータと、上記の二次元配列のデータを見比べると、二次元配列のイメージがなんとなくついてくるようにも思われます。. 1つ目の「.(ドット)」を使って記述することが一般的です。, 続いて、オブジェクトの中身を「更新」してみます。更新する場合は、次のように記述します。, では、配列と同じように「zak-papa」を「zak-mama」に、「35」を「28」に、「よろしく」を「ヤッホー」に更新してみましょう。, また、オブジェクトの「プロパティ」にないものを記述すると次のように新しい要素の「追加」になります。, 以上、「配列」と「オブジェクト」についてお伝えしました。盛り沢山の内容で少し疲れましたね。お疲れ様でした。, プログラミング初心者には最初は理解が難しかったかもしれませんが、「配列」も「オブジェクト」も、「条件分岐」や「繰り返し処理」と同じく他の言語でも同じように扱うことができますので是非使い方をマスターしておきましょう。, そして、GASにとって特に「配列」は、データの処理時間を左右する重要な役割を持つものになります。こちらの記事でスプレッドシートのデータ取得に関して説明していますので実際の使い方はご確認いただければと思います。, zak-papaです。普段は人事部で仕事をしていますが現在は長期の育児休業を取得中です。自身のアウトプットの場及び備忘録も兼ねてブログを始めました。, 本ブログでは、子育てに関する情報やノンプログラマー向けに実務に活かせる情報をお届けしたいと思っています。【2020年1月時点】. 「二次元配列」の操作. sh.getRange(1,4,rows,cols).setValues(ary); で配列全体をスプレッドシートに記入するための範囲を確保しつつ、配列に代入された値をスプレッドシートのD列~F列に記入しています。, スプレッドシートへの貼り付けに必要な範囲を確保し、二次元配列のデータを貼り付ける 処理結果, で、変数ary[i][0]~ary[i][2]に格納された値を結合し、スプレッドシートのD列に記入しています。, 以上、二次元配列を利用した例をいくつかご紹介しましたが、以前ご紹介した配列の記事と同様に処理速度においても非常に優れていますので、Google Apps Scriptを使用していく上で二次元配列は欠かせないものです。, Google Apps Script(GAS)お仕事・副業探し(Google Apps Script・GAS)Googleフォーム(Google Apps Script・GAS)Gメール(Google Apps Script・GAS)HtmlService(Google Apps Script・GAS)return(Google Apps Script・GAS)エラー検知(Google Apps Script・GAS)スクリプトエディタ(Google Apps Script・GAS)スプレッドシート(Google Apps Script・GAS)セル操作(Google Apps Script・GAS)トリガー(Google Apps Script・GAS)ファイル操作(Google Apps Script・GAS)メッセージボックス(Google Apps Script・GAS)ログ出力(Google Apps Script・GAS)処理速度(Google Apps Script・GAS)列、行(Google Apps Script・GAS)文字列操作(Google Apps Script・GAS)日時(Google Apps Script・GAS)条件分岐(Google Apps Script・GAS)演算子(Google Apps Script・GAS)繰り返し処理(Google Apps Script・GAS)配列(Google Apps Script・GAS)関数の実行(Google Apps Script・GAS), Google Apps Scriptでスプレッドシートの処理を自動化する上で、配列を扱えるようになるのは非常に重要です。 なぜかというと、配列を使って処理を行わないと、処理の量や内容によっては非常に、とても、すごく重くなるからです。 今回は、Google Apps Scriptにおける配列についてご紹介します。, 今回は、Google Apps Scriptで、変数に代入した値などを出力して、スクリプトの動作が正しいかを確認するための便利なスクリプトをご紹介します。, Google Apps Scriptでフリーランスのお仕事!高額報酬ありの求人サイトは?, 【Google Apps Script(GAS)】文字列の置換と削除(replace), 【Google Apps Script(GAS)】文字列の改行(メッセージボックスの改行), 【Google Apps Script(GAS)】Googleフォームの回答内容を、好みの形でスプレッドシートに集計する. この中の、 [[a1, b1, c1], [a2, b2, c2], [a3, b3, c3], [a4, b4, c4], [a5, b5, c5]] が二次元配列の状態になっています。 スプレッドシートに記載されているデータと、上記の二次元配列のデータを見比べると、二次元配列のイメージがなんとなくついてくるようにも思われます。 もちろん「配列」でも同じように改行して書くことができました。, 最後の「,(カンマ)」は付けても問題なく動きますが、付け外す手間もあるのでそのまま付けておくのが良いでしょう。, 変数に「代入」する場合は、配列と同じように変数名を「複数形」にして記述するのが一般的です。, 配列は「インデックス」という「箱」でしたが、オブジェクトは「プロパティ」という「箱」に入っているイメージを持ってもらえるとわかりやすいかと思います。 さらにその小さな箱の中(水色)にそれぞれ1つずつ値が入っているイメージです。, GASでは「スプレッドシート」を操作することが多く、「スプレッドシート」のデータを「配列」で扱えるかどうかが"カギ"となります。次のようにスプレッドシートの各「行」のデータは、右側に記載の通り「(一次元)配列」で扱うことになります。, 実際にスプレッドシートのデータを全て取得してみましょう。スプレッドシートには下記のデータを貼り付けてください。, コードはこちら。今の時点ではコードの意味はわからなくて大丈夫です。 配列オブジェクトのループ処理で見かけるfor...of。 MDMの解説にもあるとおり、文字列や配列オブジェクトのようは反復可能オブジェクト(iterablesオブジェクト)に対してループ処理ができます。 ということは、二次元配列に対してもループ処理できるではと試してみたら無事にできました。 【GAS】JavaScript基本⑤ 〜 複数の値を扱う「配列」「オブジェクト」を理解しよう, 例えば「人」の情報について扱う場合に、「名前」や「年齢」など1つずつ「変数」に代入して扱うことはできましたね。, 上記のように1つずつ変数を用いて扱うこともできますが、「人」の情報が複数ある場合に1つにまとめて管理できると便利ですね。そのような場合に使うのが「配列」になります。, 変数名は一般的に「複数形」が使われるので、変数「persons」に「配列」の形で代入するとこのようにスッキリ書くことができます。, まずは配列の書き方です。「[ ](角括弧)」と「,(カンマ)」を使用して記述します。, 例えば、下記のような書き方で、「①文字列のみ」、「②数字のみ」、「③文字列と数字を含んだ配列」などがあります。, 上記③を変数に「代入」する場合は、次のように変数名を「複数形」にして記述するのが一般的です。, 「配列」は1つの大きな箱(配列名:persons)の中に、それぞれの「値」がそれぞれの「箱」に入っているイメージを持ってもらえるとわかりやすいかと思います。, 「箱」の数と「値」の数は同じ「3つ」ですが、配列は「インデックス」という番号が振られ最初が「0」からスタートすることになるため注意が必要です。また、「値」のことを「要素」といいます。, では、次に「配列」からそれぞれの値を出力してみましょう。それぞれの値にアクセスするには「インデックス」を使って(「キー」として)次のように記述します。, 「zak-papa」を「zak-mama」に、「35」を「28」に、「よろしく」を「ヤッホー」に更新してみましょう。, では、配列の「インデックス」がない場合(インデックスが「3」の場合)、どのようになるでしょうか。スクリプトを実行してみると、次のように新しい要素の「追加」になります。, ただ、配列に要素を追加する場合は「push()」(後述)メソッドを使う場合が多いです。「push()」の使い方は後ほど説明します。, 最後に、配列の中に値がいくつあるか「要素数」を出力する方法も覚えておきましょう。

見慣れない形なので最初は理解が難しかったかもしれません。, しかし、GASでは「スプレッドシート」だけでなく、「Gmail」などを扱う際もこの「二次元配列」を使ってメールを取得したりします。復習してしっかりと理解しておきましょう。, 続いて「オブジェクト」です。「連想配列」とも呼ばれ、他言語でいう「ハッシュ(Ruby)」や「辞書型(Python)」と同様のものになります。, オブジェクトは配列と同じく「複数」の値を扱うときに便利なものですが、オブジェクトは「名前」付きで値を管理することができ、例えば、「35」という数字は「age」、つまり「年齢」を表していることがすぐに分かります。, また、オブジェクトは順番を保持していないのでログ出力の際は必ずしも記述した順番にはならないということも覚えておきましょう。, まずはオブジェクトの書き方です「{ }(波括弧)」と「,(カンマ)」を使用して記述します。, { }(波括弧)の中では下記のように「{ プロパティ(キー)① : 値① , プロパティ(キー)② : 値② }」の書き方をします。

var ary = [[‘A1’, ‘B1’, ‘C1’], [‘A2’, ‘B2’, ‘C2’], [‘A3’, ‘B3’, ‘C3’], [‘A4’, ‘B4’, ‘C4’], [‘A5’, ‘B5’, ‘C5’]]; sh.getRange(1,1,rows,cols).setValues(ary); で配列全体をスプレッドシートに記入するための範囲を確保しつつ、配列に代入された値をスプレッドシートに記入しています。. GASは5分を超えるスクリプトの実行ができません。そこで、スプレッドシートのデータを配列に格納する処理が必要になります。 スプレッドシートを二次元配列に格納 シートをgetRange().getValues()で二次元配列 …

「ヤッホー」は大きな箱のインデックス「1」の中にあり、さらにその中の小さな箱のインデックス「2」にありますね。なので、「persons[1][2]」と記述することでデータを取得することができます。, つまり、まずは①大きな(外側の)配列のインデックスを取得し、その後に②小さな(内側の)配列のインデックスを見ていけばいいですね。, 別の見方もしてみましょう。スプレッドシート上ではこのように考えるとわかりやすいかと思います。, 「1行目」と「A列」どちらもスタートは「0」であり、そこから目的の値まで縦(下)に何個進んで、横(右)に何個進むかで考えると上記と同じ記述の仕方になります。, 以上、「二次元配列」についてお伝えしてきました。

なお、値の「追加」は「1つ」だけでなく「複数」追加することが可能です。, 下記に簡単な配列(numbers)を用意しました。 var ss = SpreadsheetApp.getActiveSpreadsheet();var sh = ss.getActiveSheet(); var rows = ary.length;var cols = ary[0].length; ary.push([‘A’ + (i + 1),’B’ + (i + 1),’C’ + (i + 1)]), で、pushを使用して配列の末尾に配列を追加していく事で二次元配列を作成しています。. でも、この処理の仕方だと要素の数が10個や50個と増えた場合に1つずつ記述していくのは効率的ではありません。, このような場合に前回説明した「繰り返し処理」を使えばもっと楽に処理ができましたね。, 次のように配列から「for」文を使って順に要素を出力することができます。 【GAS】JavaScript基本② 〜 「データ型」について理解しよう 実行してみると下記の通り「二次元配列」で取得できていることが分かると思います。, ※ このような画面が出てきたら次の手順で許可してあげましょう。スプレッドシートを扱う場合、初回のみ「認証」が必要になります。, 冒頭でお伝えした通り、GASでは1回あたりの処理時間に制限(6分)があります。 先ほどの「名前」の部分を「プロパティ(キー)」といい、「プロパティ」と「値」の間には「:(コロン)」で繋げて記述します。, 下図の2つ目のように「改行」して書くこともでき、こちらの方が読み易くなります。 「要素数」を出力するには「length」というプロパティを使用し、次のように「配列名」と「length」を「.(ドット)」で繋げて記述します。, 最初の「zak-papa」の配列に戻って要素数を出力してみましょう。要素は「3つ」あったので「3.0」と出力されます。, 配列の中身を順に取り出すこともよくあります。今回は「fruits」配列を使って説明していきます。, こちらは配列の要素の出力と更新のところでも説明したので問題ないですね。 こんにちは! Yuki (@yukibnb) です。前回Google Apps Script (GAS) で一次元配列の要素を追加・削除する方法をGIF動画付きで解説しました。 www.yukibnb.com今回はその応用として二次元配列の要素を追加・削除する方法をサンプルやGIF動画を使ってやさしく解説します。 sh.getRange(1 + i, 4).setValue(ary[i][0]);sh.getRange(1 + i, 5).setValue(ary[i][1]);sh.getRange(1 + i, 6).setValue(ary[i][2]); そのため、[i](変数aryの1番目~5番目の行)で配列の行の要素数を指定し、次の[0]~[2](変数aryの1番目~3番目の列)で配列の列の要素数を指定して、格納されている値をスプレッドシートのD列~F列に記載していきます。, 前述の「二次元配列を宣言、作成してスプレッドシートに貼りつける」でも既にやってはいますが、配列の大きさを調べた上で、貼り付けに必要な範囲を確保してスプレッドシート貼り付ける事もできます。.