blog

コピペでOK!GAS(Google Apps Script)は至高の管理ツール ※随時更新

前置き

GASとはなんぞや(私的な見解)

Excelは使ったことはありますか?
たぶんこの記事を見る人ならExcelはまず使ったことありますよね。

ではGoogleが提供していて無料で使えるExcelのような表計算WebサービスのGoogle スプレッドシートはご存じでしょうか?

Google スプレッドシート – オンラインでスプレッドシートを作成、編集できる無料サービス

GAS(Google Apps Script)は、スプレッドシートに組み込まれている、JavaScriptベースのプログラミング言語です。

Excelでいうマクロに相当するものですが、マクロは書き方に独自性が強くて、プログラム言語を一つ丸々覚えるくらいの学習コストがかかります。(私的感想)

ですがGASならJavascriptがある程度書ければできちゃいます。

GAS独自の関数やルールは少しありますが、それらを覚えるだけでif文やfor文とか変数・配列の持ち方などはJavascriptまんまでかけるのでJavaScriptが少しできる人なら学習コストが低いのが特徴です。

さらに表計算の側でできることもけっこうあり、GASと組み合わせると簡易なWebサービスみたいなこともカンタンに出来たりします。

スプレッドシートはエクセルには無いWebアプリならではの機能がいろいろあります。
例えば、

  • 多人数での同時編集
  • バージョン管理
  • Webページの内容をリアルタイムに取得
  • Webにアップされている画像をURLで取得
  • RSSにして配信

などなど。
なので普通にExcelよりもガッツリおすすめです。
しかも無料なので!

もちろんExcelの良さもあって、罫線や文字周りなどの書式関連などはExcelのほうが細かく出来たりします。
また、Excelで作ったファイルを開くときはExcelじゃ無いと表示崩れることもありますね。

それに今までがっつりマクロ組みまくったExcelファイルがあったりとか、クライアントがWebサービス使えなかったりなどなどもあるかもですし。

なのでExcelが全く不要になることは無いと思うのでそこは適宜何とかしながら両立させてください。

僕とお仕事してくれる方は上記を踏まえて是非とも完全Google スプレッドシート化していただくようご協力お願いいたします。
m(_ _)m

前置きが長くなりましてすみません。
ではこれよりGASの書き方や便利テクニックについて説明していきますね。

GASの書き方・便利テクニック

シート読み込み

はじめの一歩。まずはこれをしないと始まりません。
データを取得したいシートや、セルの内容を編集したいシートをまずこれで指定します。

※複数の関数を組み立てていくと、同じシートを何度も読むことがよくよくありまして、何度も読むとものすっごく重たくなるため、こちらの記事を参考にさせてもらったコードになります
GASでSpreadsheetを操作する自分的ベストプラクティス – Qiita

//シート名は適宜修正で
function getMainSheet() {
  if (getMainSheet.memoSheet) {
    return getMainSheet.memoSheet;
  }
  getMainSheet.memoSheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  return getMainSheet.memoSheet;
}

//シートを読み込みたい関数内で下記を実行
const sheet = getMainSheet();
主な使い方
シートを使う場合(なのでほぼ必須)

※これ以降、変数「sheet」はこの関数で取得したシートデータが入っているものとしてすすめますね

シートのデータを配列で全取得

「ここのセルの値を取得したい!」
はGASをやっていたら最も行う作業です。

ですが、何度もセルの値を取りに行く(何度もシートのデータにアクセスしにいく)と、メッチャべらぼうにクッソ重たくなってしまいます。
(GASが実行されるたびに十数秒〜1分以上待つことも)

なのでセルの値を取得したい場合は、まず最初にセルの値を丸ごと全部取得してしまって配列化しておきましょう。
その配列から一個一個とった方がバリ早くなります。

参考(38倍も早くなったようです):
Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法

const arrayDate = sheet.getDataRange().getValues();
主な使い方
セルの値を取得する場合

最終行 取得

そのシートのデータが入っている一番下の行数を取得します。

主な使い方
forループを回す時など
const last_row = sheet.getLastRow();

セル指定

特定のセルの値を取ります。
※先述した通り、これを多用しすぎるとクッソ重たくなるので注意

主な使い方
1回だけセルからデータを取得したり書き出したいだけなので、わざわざ配列にしたりするのが面倒なとき
//取得(範囲選択)
const cell_values = sheet.getRange(13, 1, 10, 25).getValue();
//取得(セル1つのみ取得)
const cell_value = sheet.getRange(13, 1).getValue();

//出力
sheet.getRange(13, 2).setValue(cell_value);

ログ出力

JavaScriptのconsole.log()みたいなのの代わりです。
Logger.logのカッコに変数などを突っ込むと結果がログに出ます。

主な使い方
バグって困ったとき。上手く動かないとき
Logger.log();

//※ログの確認は関数を実行後に「Ctrl+Enter」

​メールを送る

実行したタイミングでメールを送ることができます。

主な使い方
報告書に精査したデータを毎日決まった時間にメールで送る
//※カギカッコ(【】)内を適宜修正してください

//送信用アドレス
const mAddress = "【exsample@logic-a.com】";

//件名
const mTitle = "【メールの件名】";

//内容
const msg = "【メールの内容】";

//送信
MailApp.sendEmail(mAddress, mTitle, msg);

※初回実行時にメール送信の許可を確認されます

発信元は実行を許可したGmailからになります。

日付のフォーマット

Googleスプレッドシートでは日付データはそのままではめっちゃ見辛いです。
(「Mon Feb 01 00:00:00 GMT+09:00 2016」 みたいな感じ)

なのでデータとして使いやすい形式に変換してから作業をすすめた方が効率的にも精神的にも何かとよいです。
(「yyyyMMdd」など。詳しいフォーマット形式はこちらあたりご参考に)

また「1週間後」などの日付計算させるのも、スプレッドシートの日付データ形式そのままでは非常にやりづらいです。
日付を数値化することで、足し算引き算で日付を出せるようになるのですごくラクです。

主な使い方
GASで日付を扱うとき全て
//フォーマット
const dates = Utilities.formatDate(new Date(xxxx), "Asia/Tokyo", 'yyyyMMdd');

//今日
const today = Utilities.formatDate( new Date(), "Asia/Tokyo", 'yyyyMMdd');

//フォーマット(数値)
const datesInt = parseInt(Utilities.formatDate(new Date(xxxx), "Asia/Tokyo", 'yyyyMMdd'), 10);

//今日(数値)
const todayInt = parseInt(Utilities.formatDate( new Date(), "Asia/Tokyo", 'yyyyMMdd'), 10);

エスケープシーケンス

「エスケープシーケンス」とは、改行とかタブなどの特殊なものを文字として表現したものです。

主な使い方
【改行】改行を含むテキストデータを作りたいとき
【タブ】HTMLソースコードを作りたいとき
//改行
var n = "\n";

//タブ
var t = "\t";
エスケープシーケンスは他にも、JavaScriptのプログラム上で意味を持つ文字(たとえば「’」「”」など)を文字列として扱いたいときにも使います

※エスケープシーケンスについてはこちらがわかりやすい記事でした
特殊な文字の入力(エスケープシーケンス) – JavaScriptのデータ型 – JavaScript入門

Gmail検索

Gmailの検索窓でできることがスプレッドシートでもできちゃいます。

主な使い方
・今週受信したメールを毎週金曜に週報としてメール送信する
・シートを開くたびにお問い合わせメールのデータ集計をする
GmailApp.search("検索窓に入れる内容", 0, 件数);
const myMsgs = GmailApp.getMessagesForThreads(myThreads);

myMsgs[i][0].getSubject();
myMsgs[i][0].getDate();
myMsgs[i][0].getFrom();
myMsgs[i][0].getPlainBody();

修正した履歴の修正箇所の探し方

GASのスクリプトエディタも独自にバージョン管理の機能を持っています。
ですが変更点が見づらいため、これを使うとよりグッドです。


「ファイル」→「変更履歴を表示」
(もしくはCtrl+Shift+Alt+H
(Macはcommand+shift+alt+H

変更したい日時をクリックし、表示されたソースを全コピー

差分チェック
(Windows…WinMerge、Mac…CompareMerge、Webサービス…difffなど)

あとがき

随時更新いたします。更新状況は こちら(Twitter) よりご確認ください!
【最終更新日 2019年4月19日】

※もし間違いや表記ミスなどありましたらご指摘くださいよろしくお願いします!