こんにちは、サーバエンジニアの池脇と申します。
みなさんは 「Google Apps Script(以下GAS)からスプレッドシートへの書き込みはさせたいけど、そのユーザに編集権限を与えたくない!」 と思ったことはありませんか?
今回はそんな時にどのような手法を取ればよいかについて、私がとった解決策を共有します。
今回解決した問題について
今回解決したのは2つのスプレッドシート( 編集権限のあるスプレッドシートA と 閲覧権限のみのスプレッドシートB )間の連携です。
具体的には
- スプレッドシートA に書き込み
- GASのスクリプトを実行し、書き込んだ内容を スプレッドシートB に転記
- 閲覧権限しか持っていないため書き込むことができずエラー発生
上記のエラーの解消を行いました。
GASをウェブアプリとして公開する
解決策は スプレッドシートBの関数をライブラリとしてスプレッドシートAに取り込むのをやめ、ウェブアプリとして公開してアクセスする ことです。
なぜウェブアプリとして公開を行うのか?
これはウェブアプリのデプロイ時に
- どのユーザーとして実行するのか
- アクセスできるユーザーは誰か
の指定を行うことができ、閲覧権限のみのユーザーでも別ユーザーとして実行することで書き込みを行うことができるからです。
手順
1. ウェブアプリとして公開したいGASにアクセスし、右上の「デプロイ」→「新しいデプロイ」を選択
2. 種類を選択の歯車から「ウェブアプリ」を選択
3. 次のユーザーとして実行を「自分」、アクセスできるユーザーを「全員1」を選択
4. デプロイを行いURLを取得
5. 以下のようにウェブアプリを叩く
function myFunction() {
const payload = {
// 書き込み処理であれば書き込む内容等
};
const options = {
method: "GET",
contentType: "application/json",
payload: JSON.stringify(payload)
};
const url = "【4.で取得したURL】";
const response = UrlFetchApp.fetch(url, options);
}
これで閲覧権限のみを持つユーザーが 5.のGASのスクリプトを実行したとしても、ウェブアプリを通して書き込む際には自分の権限で(すなわち編集権限を持つユーザーとして)書き込むことになり、編集権限を与えることなく書き込みをさせることが可能になります。
注意点
- ウェブアプリはGETであればdoGet、POSTであればdoPostの関数を探します。ウェブアプリ側の実装では関数名に注意してください
- アクセスできるユーザーに「全員」を指定する場合は誰でもアクセスすることができます。URLの公開には注意し、必要であれば認証機能をつけることを検討しましょう2
まとめ
今回はGoogleスプレッドシートの編集権限を与えずにGASから書き込みを行う手法について解説しました。
権限周りの問題は安全に仕事を進める上で避けては通れない問題です。この記事がその解決の一助になれば嬉しく思います。
-
アクセスするユーザーがGoogleアカウントを持つユーザに限られる場合は「Googleアカウントを持つユーザー全員」でも可 ↩
-
getOAuthToken()を使ってトークンを取得し、認証する等の手法があります ↩