
ページコンテンツ
このブログへアクセスする方の検索ワードを分析していると、多くの方がスマートフォンやタブレット等のモバイル端末からGoogle Apps Scriptを実行したいと思っているようです。そこで、今回はモバイル端末からスプレッドシートに作成したスクリプトを実行する方法を記事にしようと思います。
今(2020年1月16日現在)Google検索してみると、『gas スマホ』で検索してみましたが、スプレッドシートからGASを実行できると書いてあるページは見当たらなかったのでこのブログにたどり着いている方々も答えが見つからずに検索を諦めてしまっているのではないでしょうか。
少し古い情報ですが、teratailのこちらの質問への回答でもできないとの回答が出ていますが、今回ご紹介するやり方はこの質問がされた当時からできたと記憶しています。今回の記事は、そんな疑問にお答えするべく記事を執筆しました。
モバイル用のスプレッドシートアプリでは、ブラウザでアクセスした場合と比較して通常機能のいくつかに制約があります。
モバイルアプリでできないことは例えば・・・
- 限定されたアドオンしか使えない
- 上部のメニュー機能(スクリプトエディタやカスタムメニュー等)の一部が使えない
- 画像に設定したスクリプトのトリガーが機能しない
適当に例を挙げると上記のような制約があります。
スプレッドシートから能動的にスクリプトを呼び出すためには、ブラウザではスクリプトエディタを開いて実行するか、カスタムメニューから実行するか、画像などで起動ボタンを作成し、クリックして実行する場合が多いと思います。
モバイルアプリでは上記の方法で実行することができないため、皆さんやり方がわからずにこのブログにたどり着いているようです。
以前、『スプレッドシートの電話番号をスマホでタップして電話をかける方法』という記事を書いたことがあるので『スマホ スクリプト 実行』などのキーワードでアクセスしてきた人がいるのかなと予想しています。
はじめに、この記事の結論から申し上げると、モバイル端末からスクリプトを実行する方法はあります。
しかし、実装の仕方によってはプログラム起動時間に30秒という上限が設定されてしまいますので、複雑な処理は実行することができない場合があります。
今回は、実際に処理を試すことができるスプレッドシートを用意しましたので、実際に操作していただければと思います。操作できるセルは背景色をグレーにしてありますので、グレーのセルの入力内容を変更してみて下さい。
サンプルスプレッドシートはこちら
サンプルシートではスマホのスプレッドシートアプリで実行できるのはもちろん、パソコンからも動作します。
コードを勝手に編集されることが多くなったため、編集時に動作するコードは『 5つのステップで実現するonEditトリガーを外出しする方法 』で紹介している方法によって別ファイルとして外出ししています。
モバイルアプリからスクリプトを実行する方法
それでは、詳しいやり方を下記に記載していこうと思います。プログラムの内容によって、実行する方法にも2つやり方がありますのでそれぞれの内容を別々に分けて説明します。
1つのスプレッドシート上ですべての処理が完結するスクリプトの場合
1つのスプレッドシート上で処理が完了するというのは、ドライブにアクセスしたり、メールを送ったりというスプレッドシート以外のサービスを利用しないで実行するプログラムのことです。
他のスプレッドシートにアクセスしてデータの編集や参照も行わないというスクリプトであれば今から説明するやり方でモバイルアプリのスプレッドシート上からスクリプトを実行することができます。
サンプルファイルでは『スプレッドシート操作』というシートの処理がこちらの場合に該当します。
『選択肢A』の下のセルにはプルダウンメニューで『奇数』と『偶数』が選択できるようになっています。
『奇数』を選ぶと、奇数の数字が1 から若い順に左上から表示されます。
『偶数』を選ぶと、偶数の数字が2から若い順に左上から表示されます。
『選択肢B』では、セルの背景色を変更する処理を書いてみました。こちらも、プルダウンメニューには『ボーダー』と『チェック』という選択肢を用意しました。
『ボーダー』を選んでもらうと、横線を引くような形で背景色が変更されます。
『チェック』を選んでもらうと、チェック柄に背景色が変更されます。
スクリプトの関数名にonEdit()を使う
関数名にonEdit()を使用すると、スプレッドシートの編集時に自動的に起動する関数として機能します。
この機能を利用してモバイルアプリからスクリプトを実行することができます。関数名にonEdit()に設定するだけで特に追加で設定する必要もありません。
同一スプレッドシートの他のシートから値を参照して出力するといった処理であれば、この方法でスクリプトを組めばよいかと思います。
function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var sheetName = sheet.getSheetName(); var range = e.range; var row = range.getRow(); var column = range.getColumn(); if (sheetName === "スプレッドシート操作") { //処理1 } else if (sheetName === "ドライブのファイル一覧") { //処理2 } }
同一シートであれば、すでにアクセス権限はある状態ですので、プログラムは追加で権限を要求することもなくプログラムが実行させるというわけです。
ただし、手軽さの代償として、こちらのやり方の場合はプログラム実行時間は30秒以内に限られてしまいます。
他のスプレッドシートや他のサービスを利用するスクリプトの場合
プログラムで他のスプレッドシートや他のサービス(メール送信したりドライブのファイルを参照したり等)を利用する場合には、onEdit()では権限の問題で実行することができません。これは、追加で他の権限をプログラム側に許可しなければいけないためエラーが発生することが原因になります。そのような場合は、onEdit()とは別のアプローチが必要になります。
サンプルファイルでは『ドライブのファイル一覧』というシートの処理がこちらの場合に該当します。
サンプルでは、ドライブファイル一覧シートにあるグレーのセルに『プログラム実行』を入力すると、指定したフォルダに入っているファイルの名前を出力する処理を組んでみました。
今回指定したフォルダはこちらのフォルダのです。
『出力データ削除』かグレーのセルを空欄にすると出力したファイル名が削除されます。
手動でトリガーを設定する
スプレッドシートを編集時に起動するトリガーを手動で設定することで権限の問題を解消することができます。トリガーを設定するので、この場合はonEdit()とは違う名前を関数名として設定するのが良いと思います。
トリガーを設定するアカウントで権限の許可をすることで様々なサービスと連携させたプログラムを実行できるようになります。
この場合のプログラム実行者は、トリガーを設定したアカウントになりますので、スプレッドシート編集者がアクセス権限のないファイルでもトリガー設定をしたアカウントにアクセス権限があればそのファイルを参照して処理を行うことができます。
例えば、見せたくないデータや編集されたくないデータを扱う際に有効利用できると思います。
トリガーの種類について
今までの説明で、察しの良い方はお気づきかも知れませんが、トリガーには実は2種類のタイプが存在します。
公式リファレンスでは、それぞれをSimple TriggersとInstallable Triggersと呼ばれて説明されています。
Simple TriggersはGoogle Apps Script上で予め用意されているトリガーで、関数名にSimle Triggers対応の名前を使用することで設定ができるタイプのトリガーです。
Simple Triggersには・・・
- onOpen(e) ファイルを開いた時に実行
- onEdit(e) ファイルを編集した時に実行
- onInstall(e) アドオンをインストールした時に実行
- doGet(e) GETリクエストされた時に実行
- doPost(e) POSTリクエストされた時に実行
こちらの5種類が用意されています。関数名の横にそれぞれ簡単な説明書きを併記しました。
これらは関数名に上記名前をつけるだけで自動的にトリガー設定されるSimple Triggersの関数になります。
引数のeにはイベントオブジェクトが入りますので、それぞれの関数に設定されている情報が格納されます。
Simple Triggersには下記のような制約がありますので、利用される際はご注意ください。
- スクリプトはスプレッドシートやドキュメント、プレゼンテーション、フォームとバンドルする必要があります
- バンドルするファイルの編集権限がないと使用できません(閲覧権限とコメント権限では利用できません)
- 認証が必要な処理は実行できません
- バンドルしているファイル(スプレッドシートやドキュメント等)はプログラム処理可能ですが、ドライブ上の別ファイルはプログラム処理が適用できません
- セキュリティ上の理由からアクセスユーザーの情報は取得できない場合があります(Gsuiteの同一ドメイン内であればアクセス可)
- 30秒以上の処理を実行できません
- それ以外はGoogle Apps Scriptの利用制限が適用されます
上記の内容に留意して利用して下さい。
onOpen(e)もSimple Triggersでスプレッドシートでも利用できる関数ですが、モバイル端末のアプリからは処理が実行されません。
Installable Triggersは、自分でトリガーの設定を行うタイプのトリガーになります。今回の例では、手動で編集時トリガーを設定した『ドライブのファイル一覧』シートのトリガーがInstallable Triggersに分類されます。
Installable Triggersの場合には、Google Apps Scriptの利用制限が適用されますが、それ以外の利用制限はありません。通常の実行時と同じ条件でプログラムが実行できます。
編集時トリガーの処理方法について
編集時に自動的に起動するトリガーは編集したセルの情報を取得することができます。通常はonEdit(e)のように記載し、eにはイベントオプジェクト(編集に関する内容)が格納されます。
具体的にスプレッドシートのonEdit関数で取得できる情報は下記の通り
- oldValue(変更前の値)
- range(変更したセル)
- source(プログラムがバンドルされたスプレッドシート)
- triggerUid(トリガーのID)
- user(変更したユーザーのアカウント)
- value(変更後の値)
イベントオブジェクトにはこのようなデータが格納されます。
e.oldValue
e.range
e.source
e.triggerUid
e.user
e.value
のような形で指定するとイベントオブジェクトの値が取得できます。
編集時の処理としては、基本的にはシートやセル位置を条件にプログラムを作成することになります。何も条件づけを行わないとどのシートのどのセルを編集したとしてもプログラムが起動してしまい、起動してほしくないタイミングで処理が実行されてしまいます。
そのため、変更が行われたシート名を取得し、セルの位置を特定した上で特定の条件に一致する場合にそれ以降の処理が実行されるようにします。
簡単なサンプルコードを記載します。
function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var sheetName = sheet.getSheetName(); var range = e.range; var row = range.getRow(); var column = range.getColumn(); if (sheetName === "スプレッドシート操作") { if (row === 2 && column === 2) { //スプレッドシート操作シートのB2セルが編集された時のみ実行される処理 } } else if (sheetName === "ドライブのファイル一覧") { if (row === 1 && column === 2) { //ドライブのファイル一覧シートのA2セルが編集された時のみ実行される処理 } } }
まとめ
今回の記事では、GASで作成したスプレッドシートのコード(マクロ)をスマートフォンやタブレットのスプレッドシートアプリから呼び出す方法をまとめました。
機種によってはうまく動作しない場合もあるかもしれませんが、私の試した端末ではAndroid端末でもiOS端末でも実行できることが確認できました。
スマホ世代の人にはこのような方法で自動化を実現できるかもしれませんね。