Google Apps Script と Spread Sheet

Google Apps Script を使って SpreadSheetにアクセスします。
Google Apps Script は Google Drive 上で、無料で使える開発・実行環境です。

ここでは、Google Spread Sheet にただアクセスするだけでなく、より実践的なコードも紹介します。

具体的には

selectAll: すべてのデータを取得し、連想配列に入れます。
insert: データを挿入します。
update: データを更新します。

これらのメソッドの実装例を紹介していきます。

Spread Sheet のデータを取得する基本の方法

Spread Sheet の指定が必要です。
どのシートからデータを取得するかIDを取得する必要があります。
これには、Spread Sheet の URL をみてみます。
https://docs.google.com/spreadsheets/d/{ここがIDです}/

Google Drive の中で対象のIDといったら、通常ここの文字列のことです。

では、まずこのSpread Sheet を普通に開き、中のデータを取得してみます。

コード.gs に以下のように記述します。

一行目で全体を取得し、
二行目で一枚目のシートを指定して取得し、
三行目でデータがある範囲を取得して、その中身を取得します。

このコードを例えば以下のように記述します。

そしてメニューバーの「関数を選択」のドロップボックスから、「testSheet」を選択し、実行ボタン(再生ボタンの形です)を押します。

その後、Ctrl + Enter を押すと、Logger.log に渡されたデータを見る事が出来ます。

通常この動作で関数ごとのデバックを行えるのですが、今回のコードは初回実行時に、許可を出す必要があります。

このアプリ内で、「SpreadSheetApp」のライブラリを使う許可を、自分のアカウントで付与しましょう。

また、参照しようとしているSpreadSheetが、自分のアカウントで閲覧可能である必要もあります。

Class を使ってリファクタリングする

可読性の高いコードに変更しながら、実践的なコードの記述をしていきましょう。
selectAll、insert、updateを実装していきます。

まずは sheetIdを受け取ってインスタンスを返すようにコードを変更します。
外部可変変数を出来るだけ動作本体から分離します。

ECMAScript 2015(ES6) からjavascriptではclassが導入されています。
Google Apps Script ではES6が動作しますので、classを用いて、実装の分離を行いつつ、selectAll等を実装していきます。

データ構造を定義する

SelectAll、Insert、Updateを実装するために、ここで、データ構造の定義が必要になります。
さらに先に進む前に、DBとして扱うSpreadSheetのデータ構造を決定しましょう。
今回は、SpreadSheetからデータ構造を読み込むタイプで作成します。
別途定義情報をGAS内部に定義する方法もあり、一長一短です。

idnamelabellevelnote
2crisクリス13町人
1annaアンナ22村娘

ここでポイントは二点です。

  1. 一行目は各カラムの名称をつける行にする
  2. 一カラム目はid(通し番号。上に行くほど新しい)

すべてのデータベースはこの構造を持つことを前提した上で、コードを書いていきます。

上に行くほど新しいのは、このシートが書き込み可能なシートであり、新しいデータを上に挿入していくからです。

注意点として、この定義が壊れてしまうと、プログラムが壊れてしまいます。

SelectAll を実装する

SellectAll の設計をしていきます。
上記のように記述されたSpreadSheet を SelectAll したとき、
[ {カラム名称 => 内容, カラム名2 => 内容} ,…(次のデータ)]
の連想配列にして取得するコードです。

Insert を実装する

insertの実装も行っていきましょう。
新しいデータを、どんどん追加できます。

このinsertを用いるときは、以下のようになります。

データに抜けがあっても、keyにしたがって、新しいIDを付与してデータをインサートします。

Update を実装する

Updateは該当のIDを検索し、keyにしたがって値を変更します。
その都合上、どうしても全体を取得せざるを得ないと思っています。

使ってみましょう!

insertで既に入っているデータを、keyにしたがって上書きします。

より堅牢なプログラミング方法について

実装方法にはいくつもの選択肢があります。
上記した、「DBのSpreadSheetの定義内容をGAS内部に記述する」方法です。
例えば今回の実装では、誰かがSpreadSheetのkey行をちょっと変更すると、プログラムが壊れます。
正確なInsertやUpdateが出来なくなるからです。
それを防ぐために、GAS内部に定義するほうが、より堅牢な設計だといえます。

今回はひとつのメソッドにすべての要素に入れるために、1メソッドで簡潔する実装です。

参考にしていただき、リファクタリングしてみましょう!

最終更新: 2021年9月23日