GASでモバイル端末からスプレッドシートのスクリプトを実行する方法
このブログへアクセスする方の検索ワードを分析していると、多くの方がスマートフォンやタブレット等のモバイル端末からGoogle Apps Scriptを実行したいと思っているようです。そこで、今回はモバイル端末からスプレッドシートに作成したスクリプトを実行する方法を記事にしようと思います。
今(2022年4月11日現在)Google検索してみると、『gas スマホ』で検索してみましたが、スプレッドシートからGASを実行できると書いてあるページは見当たらなかったのでこのブログにたどり着いている方々も答えが見つからずに検索を諦めてしまっているのではないでしょうか。
少し古い情報ですが、下記のteratailの質問でもできないということで回答が出ています。
今回ご紹介するやり方はこの質問がされた当時からできたと記憶しています。
今回の記事は、そんな疑問にお答えするべく記事を執筆しました。
※現在ではyeah_dudeさんが私のブログのリンクを貼っていただいたようですね。ありがとうございます。
ブラウザでアクセスした場合と比較してモバイル用のスプレッドシートアプリでは、通常機能のいくつかに制約があります。
モバイル版のアプリでは・・・
- 限定されたアドオンしか使えない
- 上部のメニュー機能(スクリプトエディタやカスタムメニュー等)の一部が使えない
- 画像に設定したスクリプトのトリガーが機能しない
いくつか例を挙げると上記のような制約があります。
スプレッドシートから能動的にスクリプトを呼び出すためには、下記の3つのやり方で実行するパターンが多いと思います。
- ブラウザではスクリプトエディタを開いて実行する
- カスタムメニューから実行する
- 画像などで起動ボタンを作成し、クリックして実行する
モバイルアプリでは上記の方法で実行することができないため、皆さんやり方がわからずにこのブログにたどり着いているようです。
以前、
上記の記事を書いたことがあるので『スマホ スクリプト 実行』などのキーワードでアクセスしてきた人がいるのかなと予想しています。
はじめに、この記事の結論ですが、
モバイル端末からスクリプトを実行する方法はある
ただし、実装方法によっては色々と制約が残ってしまうことも事実です。
制約とはたとえば、
- プログラムの起動時間の上限が30秒までになってしまう
- 複数のファイルを操作することができない
などです。
今回は、実際に処理を試すことができるスプレッドシートを用意しました。
実際に操作して挙動をご確認ください。
操作できるセルは背景色をグレーにしてありますので、グレーのセルの入力内容を変更してみて下さい。
サンプルシートではスマホのスプレッドシートアプリで実行できるのはもちろん、パソコンからも動作します。
コードを勝手に編集されることが多くなったため、編集時に動作するプログラムは外部ファイルとしています。
onEdit関数などを外部ファイルとするやり方が気になる人は下記の記事もご確認ください。
モバイルアプリからスクリプトを実行する方法
それでは、詳しいやり方を下記に記載していこうと思います。
プログラムの内容によって、実行する方法にも下記の通り2つやり方があります。
- 1つのファイルですべての処理が完結するスクリプトの場合
- 複数のファイルや複数のGoogleサービスを連携させるスクリプトの場合
それぞれの内容を別々に分けて説明します。
1つのスプレッドシート上ですべての処理が完結するスクリプトの場合
1つのスプレッドシート上で処理が完了するという言葉の定義を最初に行います。
ドライブにアクセスしたり、メールを送ったりせず、1つのスプレッドシート以外のサービスを利用しないで実行するプログラムのことです。
この条件であれば、今から説明するやり方でモバイルアプリのスプレッドシート上からスクリプトを実行できます。
サンプルファイルでは『スプレッドシート操作』というシートの処理がこちらの場合に該当します。
選択肢Aの処理説明
『選択肢A』の下のセルにはプルダウンメニューで『奇数』と『偶数』が選択できるようになっています。
『奇数』を選ぶと、奇数の数字が1 から若い順に左上から表示されます。
『偶数』を選ぶと、偶数の数字が2から若い順に左上から表示されます。
選択肢Bの処理説明
『選択肢B』では、セルの背景色を変更する処理を書いてみました。こちらも、プルダウンメニューには『ボーダー』と『チェック』という選択肢を用意しました。
『ボーダー』を選んでもらうと、横線を引くような形で背景色が変更されます。
『チェック』を選んでもらうと、チェック柄に背景色が変更されます。
このタイプのスクリプトの作り方は関数名にonEdit()を使う
関数名に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()を付ける方法とは別のアプローチが必要になります。
サンプルファイルでは『ドライブのファイル一覧』というシートの処理がこちらの場合に該当します。
サンプルでは、ドライブファイル一覧シートにあるグレーのセルに『プログラム実行』を入力すると、指定したフォルダに入っているファイルの名前を出力する処理を組んでみました。
『出力データ削除』かグレーのセルを空欄にすると出力したファイル名が削除されます。
手動でトリガーを設定する
こちらのやり方では、スプレッドシートを編集時に起動するトリガーを手動で設定することで権限の問題を解消することができます。
トリガーを設定するので、この場合は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には下記のような制約がありますので、利用される際はご注意ください。
- スクリプトはスプレッドシートやドキュメント、プレゼンテーション、フォームとバンドルする必要がある
- バンドルするファイルの編集権限がないと使用できない(閲覧権限とコメント権限では利用不可)
- 認証が必要な処理は実行できません
- バンドルしているファイル(スプレッドシートやドキュメント等)は参照 / 出力可能だが、ドライブ上の別ファイルは参照 / 出力不可
- セキュリティ上の理由からアクセスユーザーの情報は取得できない場合があります(Google Workspaceの同一ドメイン内であればアクセス可)
- 30秒以上の処理を実行できません
- それ以外はGoogle Apps Scriptの利用制限が適用されます
上記の内容に留意して利用して下さい。
Installable Triggersは、自分でトリガーの設定を行うタイプのトリガーになります。
今回の例では、手動で編集時トリガーを設定した『ドライブのファイル一覧』シートのトリガーがInstallable Triggersに分類されます。
Installable Triggersの場合には、Google Apps Scriptの利用制限が適用されますが、それ以外の利用制限はありません。通常の実行時と同じ条件でプログラムが実行できます。
GASの利用制限については下記の記事を参照
編集時トリガーの処理方法について
編集時に自動的に起動するトリガーは編集したセルの情報を取得することができます。通常はonEdit(e)のように記載し、eにはイベントオプジェクト(編集に関する内容)が格納されます。
具体的にスプレッドシートのonEdit関数で取得できるeの格納情報は下記の通り
- 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端末でも実行できることが確認できました。
スマホ世代の方々にはこのような方法で自動化を実現できるかもしれませんね。