Google Apps Scriptコーディングガイドライン【随時更新】


GASコーディングガイドライン

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

弊社でお仕事をする場合に、「こういうコーディングルールでやろうね」というのを、自分自身または一緒にお仕事をするパートナーさんにお伝えすべく、VBAのコーディングガイドラインを作成しておりました。

エクセルVBAコーディングガイドライン【随時更新】
弊社でエクセルVBAのお仕事をする際の「コーディングルール」。自分自身またはパートナーさん用ですが、拙著にほとんど書いてある内容ですし、企業秘密とするほどのことでもないので記事にしました。随時更新していきます!

昨今、Google Apps Scriptのお仕事も増えつつありますので、コーディングガイドラインのGAS版を作りました。

あくまで、弊社ではこう…というものなので、いろいろとご意見、好み、その他、色々とあるかもしれませんが、一部でも皆様のご参考になれば幸いです。

命名規則

変数、定数、関数などにつける名前を、識別子といいます。

識別子は一定のルールを守っていれば、自由に命名できますが、スクリプトの読みやすさや開発効率を考えて以下の点に留意します。

  • 中身や役割がわかるような意味のある名前をつける
  • 英単語を使い、日本語は使わない

ある程度長い名前でも alt + / で単語補完が使えるので、意味がわからないよりは長い方がマシです。

変数名

変数名はアルファベットのキャメル記法で書きます。

変数の内容が明確かつ宣言から近い距離で完結するのであれば

  • url
  • body
  • message
  • thread
  • number
  • sheet

などの単一単語での変数名も問題ありません。

そうでない場合、データ型に合わせて、以下接頭語で始める方法もあります。

  • str:String
  • date:Date
  • rng:Range
  • sheet:sh

状況に応じて以下接頭語を使うことを推奨します。

  • row:行
  • col:列
  • min:最小
  • max:最大
  • avg:平均

ただし、以下については短くてシンプルな名称でも可読性には影響を与えませんので、使っても問題なしです。

  • i, j, k:カウント変数
  • tmp, buf:一時的な変数
  • obj:一時的なオブジェクト変数

GASは変数とそのデータ型については寛容で、数値型の値を入れていた変数に、文字列型の値を上書きするといった処理も可能です。

トラブルの元になるので、その変数がどの型なのかわかるようにしておきましょう。

配列や集合の変数名

配列や集合の場合、複数形の変数名にします。

  • values
  • sheets
  • messages
  • threads
  • events

GASの場合は、取得した結果が配列である場合が多いですが、arr~やobj~とするよりわかりやすく文字数も少なくて済みます。

関数名

関数名もアルファベットのキャメル記法で書きます。

また「~かどうか」を返すBoolean型のFunctionプロシージャに関しては

  • is~
  • has~
  • can~

を使うとわかりやすいですし、if文の条件式にそのまま突っ込めたりしてかっこいいです。

コンストラクタ名は、通常の関数名と区別する為に、先頭を大文字で始めるのが一般的です。

定数

定数はアルファベットのスネーク記法で書きます。

また、場合によっては後述するプロパティストアを利用するのもいいでしょう。

変数の宣言

まず、前提として、不必要な変数は増やさないようにしたいところです。

変数が増えるということは、管理すべき対象が増えるということなので、無駄に増やすと可読性やメンテナンス性を低下させることになります。

重複や無駄のないように、最低限必要な変数を準備するようにしましょう。

スコープはできる限り小さく

原則、変数・定数はプライベートで使用します。

それにより可読性と安全性が高まります。理由もなくグローバル領域には記述しないように…。

また、宣言をするのは、使用する直前での宣言が望ましいです。

ただし、定数の場合は、以下のプロパティストアの利用も考慮しつつ、スクリプトファイルの冒頭のグローバル領域にまとめて宣言をしておくのもよいでしょう。後で値を変更するときに、わかりやすい位置にあると便利です。

プロパティストア

GASではプロパティストアに、プロジェクトやドキュメントに紐付く形でデータを格納しておくことができます。

プロパティストア

ファイルのIDや外部と接続するために必要な情報をスクリプトから分離して安全に管理することができます。

プロパティストアにはいくつか種類がありますが

  • プロジェクトに紐づくデータ:スクリプトプロパティ
  • ドキュメントに紐づくデータ:ドキュメントプロパティ
  • 実行ユーザーに紐づくデータ:ユーザープロパティ

という使い分けをします。

Google Apps Scriptで実行したユーザーごとのスプレッドシートを新規作成する
ユーザーごとのスプレッドシートを作ってそのIDを管理する必要があるなら、ユーザープロパティを使うと便利です。今回は、GASでユーザーごとのスプレッドシートを作成してユーザープロパティで管理する方法です。

コードのフォルム

ステートメント

GASでは自動でステートメントの末尾が判別されますが、判別が常に正しいとは限らないので、ステートメントの終わりにはセミコロン「;」をつけます

また、特別な理由がない限り1行に1ステートメントを記述します。

ネストとインデント

ネストであれば必ずその深さの分のインデントを加えてください。理想としては深さは3つまでがいいですね。

インデントをそろえる場合は、Tab キー活用すると、自動でそろえてくれます。

複数の行を選択しても、GASが判断して整形してくれるので、大変便利です。

縦に揃える

一行が長いときには、縦に揃えることを意識すると可読性が高まります。

長いメッセージを生成するときや

オブジェクトや配列のリテラルを記述するときなどに有効です。

状況によって、使い分けてください。

コメント

コードを見てわかるコメントは不要

一般的にコードを見ればわかるような内容についてのコメントは不要です。

例えば以下のようなパターン。

コメント入れなくてもわかることはコメントしなくてOK!

ドキュメンテーションコメント

関数を作成する際に、ドキュメンテーションコメントを設定し、その役割や引数、戻り値を記載するようにしましょう。

また、ドキュメンテーションコメントを入れることで、スプレッドシートで利用するカスタム関数使用時に、補完の候補としたり、詳細情報を表示したりできるので便利です。

ドキュメンテーションコメント

「//」によるコメントを優先

Ctrl + / で、現在カーソルのある行や複数行の選択範囲をコメントイン、コメントアウトできるので、「/* ~ */」によるコメントよりも「//」を優先して使用します。

比較演算子

演算子「==」と「!=」は左辺と右辺のデータ型が異なっていても、データ型を変換した上で比較をします。

一方で、演算子「===」と「!==」は左辺と右辺のデータ型が異なっていることを厳密に判断して比較します。

したがって、データ型も含めて厳密に比較をする「===」と「!==」を優先して使用するようにしましょう。

マジックナンバーは禁止

マジックナンバーは使用禁止です。メンテナンス性を著しく犠牲にします。マジックナンバー、絶対ダメ!

マジックナンバーになりやすいポイントとしては

  • 行数、列数
  • 係数
  • セルのアドレス
  • 配列やオブジェクトの要素数
  • 引数
  • ファイル名、パス名
  • パスワード
  • URLやメールアドレス

などがあります。

ユーザーの干渉・省略

テーブルの走査

テーブルの走査をする際の最終行はgetLastRowメソッドで取得することができます。

【初心者向けGAS】for文を使ったスプレッドシートの繰り返しの超基本
初心者向けGoogle Apps Script超入門、GASプログラミングの基本を学んでいきます。今回は、for文を使った繰り返しの超基本。カウント変数、初期化式、条件式、増加式の意味と使い方です。

アクティブシートとシートの保護

シートが一つであれば、getActivesheetメソッドでシートを指定するようにします。

ユーザによるシート名の変更にも対応でき、高速化の面でも有利です。

一つのシートで運用できるよう、工夫しましょう。

また、複数シートが存在する場合は、getSheetByNameメソッドなどを使用する必要があります。

この際、ユーザーがシート名を変更しないように運用する必要があります。

絶対に保護したい場合には、対象のシートを非表示にしたり、シートを保護することで、干渉を受けないようにすることができます。

【初心者向けGAS】スプレッドシートのシートを取得する2つの方法
初心者向けのGoogle Apps Script入門シリーズとして、GASプログラミングの基礎をお伝えしています。今回は、スプレッドシートからシートを取得する2つの方法をお伝えします。

構造データの使用

スクリプトで主に操作をするスプレッドシートのデータは、特に理由がない限りテーブル形式になるように心がけましょう。

  • A1セルから構成する
  • 空白行・空白列を設けない
  • セルの結合を使わない
  • 見出しは1行で構成する
  • 同じ種類のデータはシートを分けない

つまり、ピボットテーブルを作成できるデータの整理の仕方が望ましいです。

データを構造データで持つかどうかが、それを操作するプログラムの作りやすさに大きく影響します。

A1セルからデータが存在する最終行と最終列までの範囲を取得するgetDataDangeメソッドや、シートに行を追加するappendRowメソッドを使うことができます。

スクリプトの高速化

GASではスクリプトの実行時間に6分という厳しい制限が設けられています。

APIのアクセス回数を減らして、処理速度を少しでもあげましょう。

配列の利用

スプレッドシートのデータやGmailのメッセージをはじめ、GASで取り扱うデータは、直接操作をするよりも、配列に格納して処理する方が、格段に処理速度を向上させることができます。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

スプレッドシートで複数のセルを取り扱う場合はgetValuesメソッドsetValuesメソッドを使用して、配列を利用します。

これはかなり重要なテクニックなので、必ずマスターしたいところです。

シートにレコードを追加する

シートにレコードを追加する場合は、appendRowメソッドを使うことで配列から直接レコードを追加することができます。

Google Apps Scriptで配列を使ってスプレッドシートにデータ行を追加する方法
Google Apps Scriptでは配列操作が非常に重要です。実行速度が5分を超えてエラーとしないテクニックとして、スプレッドシートへのレコード追加を配列へのpushメソッドで処理する方法をお伝えします。

範囲の指定が不要で、Sheetオブジェクトに直接実行できます。

グローバル領域

どの関数にも属さない領域をグローバル領域といいます。

スコープ

グローバル領域へのステートメント記述は、実行順がわかりづらくなります。

特に理由がない限りは記述しないようにしつつ、記述する場合も特定のgsファイルの一番上にまとめて記述するほうがいいでしょう。

また、グローバル領域で宣言した(グローバル変数)は全ての関数からアクセスすることができ、変更を加えることもできます。

望まない影響を受ける可能性があるので、極力使わないようにしましょう。

まとめ

以上、Google Apps Scriptのコーディングガイドラインでした!

良いガイドライン見つけたら、随時更新していきますね。


The following two tabs change content below.
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ ★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ ★フォロー頂ければ嬉しいです。

コメント