
これまで何度もご紹介してきたGoogle Apps Script(GAS)。
Googleが提供しているスプレッドシート(Excelと同等のもの)上で動くプログラムだと思ってもらえればOKです。
スプレッドシート上で、繰り返し行う面倒な作業を自動化したり、自動で様々な計算を行わせることが可能です。
さらに、GoogleフォームやGoogleカレンダーと連携することも可能なので、使いこなすとそれはそれは便利なものです。
さて、過去に現場運営表をスプレッドシートで作成する方法をご紹介してきました。
また、予約フォームと連携して自動で現場運営表を作成することも可能であるとお伝えしました。
今回は、事前準備では無くダイビング当日のお話です。
健康状態のチェックは予約の段階で確認できますが、当日の体調に関しては、当日確認するしかありません。
紙のチェックリストに記入してもらう、もしくは全体で挙手してもらう、などの方法があるでしょう。
そういった方法でも良いのですが、これも電子化できたら素敵だと思いませんか?
わざわざ必要ないという声が聞こえてきそうですが、電子化することによって、体調チェックとダイビング本数を紐づけるなど、体調チェックを体調チェック以外の物にも活用することが出来る様になります。
実際、我々が現場を運営させてもらう際には、その様にしています。
具体的には
- Googleフォームでチェックリストを用意しておく
- 記入して貰う
- GASを使って運営表に反映
- ダイビング終了後、本数集計
といった流れです。
もちろん、そのダイバーが他の場所で潜った本数をカウントすることは出来ないので、よっぽど常連さんだらけのお店でないと本数管理は出来ないかもしれませんが…
今回の本題はここからです。
GASの唯一の弱点として、スマホからは起動できない点がありました。
実際、上記3を行う際には、わざわざPCを開いていました。
これでは面倒です。
ということで、今回はスマホからGASを起動する方法を考えてみました。
これを利用することで、体調チェックに限らず、ルーティン化した作業であれば、スマホから起動させることが出来るので、なかなか便利だと思いますよ!
仕組み
とはいえGASをスマホから直接起動することは出来ません。
スプレッドシート上にボタンを設置し、そのボタンを押したらGASを起動、ということが出来るのですが、これもPCからしか動作してくれません。
ということで一工夫です。
GASを起動させる方法 (トリガーと言います) は以下の通り。
- ボタンなどを押したら実行
- スプレッドシートを開いたら実行
- スプレッドシートの内容を変更したら実行
- 指定した時間に実行
- Googleカレンダーが編集されたら実行
- Googleフォームが送信されたら実行
今回は最後の、Googleフォームを利用したいと思います。
Googleフォームをスマホから送信した場合でも、正常に動いてくれるので安心です。
流れは以下の通り。
- トリガー用のGoogleフォームを用意する
- トリガー用フォームの回答が保存されるスプレッドシートにGASを記述
- フォームを送信するとGASが実行される

ただしこれに加えてひと工夫が必要です。
GASを実行する場合、スプレッドシート内のどのシートに実行するのかを指定する必要があります。
実行するスプレッドシート自体にGASを記述する場合、今開いてるシートに、という指定をすることが出来ますが、別のスプレッドシートに記述したGASから実行する場合、明確に指定してやる必要があります。
そこで、対象となるスプレッドシートのシート名をトリガー用フォームの選択肢とすることで、シートを指定しようと思います。
そして、シートは増減がある可能性があるので、1時間おきや1日おきなど、適切なタイミングで選択肢が自動で更新される様にします。

コード
①フォームの選択肢を制御するGAS
以下のコードで、実際の処理の対象となるスプレッドシートのシート名を、トリガー用のフォームの選択肢にします。
そして、この処理を一定の時間ごとに自動で実行させます。
function updateform() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var sheetnames = [];
for(var i=0;i<sheets.length;i++){
if(!sheets[i].isSheetHidden()){
sheetnames.push(sheets[i].getName());
}
}
var form = FormApp.openById('フォームのID');
var items = form.getItems(FormApp.ItemType.LIST);
items.forEach(function(item){
if(item.getTitle().match(/実行するシートを選択してください.*$/)){
var choiselist = item.asListItem();
var choices = [];
sheetnames.forEach(function(name){
if(name != ""){
choices.push(choiselist.createChoice(name));
}
});
choiselist.setChoices(choices);
}
});
}
②実際の処理を行うGAS
以下のコードで、トリガー用のフォームで選択されたシートに対して処理を実行する様にします。
これをフォームが送信されるたびに自動で実行される様にします。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastrow = sheet.getLastRow();
var choise = sheet.getRange(lastrow, 2).getValue();
var operation = SpreadsheetApp.openById('対象のスプレッドシートのID');
var target = operation.getSheetByName(choise);
//ここから先で、実行したい処理を記述
}
今回は体調チェックの回答チェックというタイトルにはしましたが、これを応用すれば様々な処理をスマホから起動することが可能になります。
どんなものに応用できそうか、これから考えていく段階なので、ダイビングに活用できそうなものを思いついた際には、またこちらで取り上げたいと思います!