CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

【2018/11/8更新】Google Apps Scriptで「スクリプトにはその操作を行う権限がありません。」が出た時の対処法

2018/11/8 sendEmailが使えない時の対処方法を追加

先日、勉強会の開催のためにGoogleフォームを準備していました。Googleフォームではメールアドレスを入力してもらうと、送信完了時に、「お申し込みありがとうございました」のような内容が入ったメールを自動返信させる機能を作ることができます。

この機能は以前作ったことがあるのですが、そのまま使ったところ自動返信メールが届きませんでした。

今回はエラー回避方法を紹介しますが、その前にGoogleフォームの概要、および回避するために使うGoogle Apps Scriptについても簡単に説明します。




1. Googleフォームとは?

Googleフォームとは、アンケートを作り、回答を集計できるサービスです。以下のページからアクセスすると使うことができます。

Google フォーム - アンケートを作成/分析できる無料サービスです

アンケートの作り方はすでに色々なところで紹介されているので省略します。たとえば、以下のサイトではとてもわかりやすく解説されています。

初めてのGoogleフォーム:作り方と活用方法を紹介します! | デスクワーク ラボ

簡単作成!Googleフォームを使ったアンケートの作り方・回答集計

回答者がGoogleフォームを使ったアンケートに回答して送信ボタンを押すと、このようなページに遷移します。

Googleフォーム回答後の画面例

これがGoogleフォームの基本機能です。ここにメールの自動返信をつけるには、Google Apps Scriptを使います。

2. Google Apps Scriptとは?

Googleが公開しているアプリ(例:スプレッドシート、カレンダー、Gメール)などの機能を拡張できる仕組みです。Javascriptベースで作るための開発環境がWeb上に準備されており、色々な処理を作ることができます。

何ができるのか、についてはこちらに詳しく書かれていたので参考にさせていただきました。

【保存版】初心者向け実務で使えるGoogle Apps Script完全マニュアル

余談ですが、Google Apps ScriptはGASと略されるようです。以後、この記事でもGASと表記します。

【スポンサーリンク】



3. 自動返信機能を作る方法

作成方法は色々なサイトで紹介されておりました。その中でもっともわかりやすかったサイトを紹介いたします。

【最新版 コピペでOK】Googelフォームを使って自動返信の問合せフォームを作る。 | WEB担当者の備忘録

この通りに実行すると自動返信の機能を作ることができます。

4. マニフェストに権限を追加する

ようやく本題です。先ほどのサイトに沿って、以下の記述をしておくと、処理が失敗した時にメールが届きます。

var admin = '/*処理が失敗した時に通知してほしいメールアドレス*/';
try{
/*必要な処理を書く*/
}catch(e){
    MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message);
 } 

しかし、動作確認をしたところ、100%の確率で以下の内容を含むメールが届きました。また、原因がよくわかりませんが、自動返信メールは来たり来なかったりしました。


スクリプトにはその操作を行う権限がありません。その操作を行うには「
(https://www.googleapis.com/auth/gmail.send ||
https://www.googleapis.com/auth/gmail.compose ||
https://www.googleapis.com/auth/gmail.modify || https://mail.google.com/ ||
https://www.googleapis.com/auth/gmail.addons.current.action.compose)」権限が
必要です。

こちらの記事のおかげで、マニフェストを開いて必要な権限を追加することで解決できそうとわかりました。

Google Apps Scriptに追加されたマニフェストについて - Qiita

マニフェストは、スクリプトエディタの「表示」から「マニフェストファイルを表示」を選択すると表示される「appsscript.json」というファイルです。ここで出て来たファイルに、先ほどのメールで届いた権限を追加したところ、エラーが出なくなりました。

最終的に「appsscript.json」はこのようになりました。

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "oauthScopes": ["https://www.googleapis.com/auth/script.send_mail",
                  "https://www.googleapis.com/auth/spreadsheets",
                  "https://www.googleapis.com/auth/gmail.modify",
                  "https://www.googleapis.com/auth/gmail.send",
                  "https://www.googleapis.com/auth/gmail.compose",
                  "https://mail.google.com/",
                  "https://www.googleapis.com/auth/gmail.addons.current.action.compose"
  ],
  "exceptionLogging": "STACKDRIVER"
}

【スポンサーリンク】



5. 困ったときは(自動返信が効かなくなった場合)

(2018/11/8追加)
先日、自動返信が動かなくなりました。ただし、エラーと判定されないため、エラー通知メールが来ないという困った状況です。

Google Apps Scriptでエラーが出ていない画面

また、別のGoogleアカウントで同じスクリプトを準備すると自動返信は動くので、うまく原因が切り分けられていません。

GASの情報は古いものが多いですが、1件だけ海外サイトで同じ症状の報告があったのでリンクを貼っておきます。

MailApp.sendEmail() in Google Apps Script not sending email - Stack Overflow

このサイトでは、MainApp.sendEmail関数が10月終わり頃から突然動かなくなった、という投稿があり、回答者がGmailApp.sendEmailを勧めています。

ここではGmailApp.sendEmailを使うことで解決したようです。私はこの方法でも解決できませんでしたが、参考のため貼っておきます。


6. 終わりに

自動返信メールが来たり来なかったり、という現象の原因は不明なままです。

Google Apps Scriptはたまに仕様変更があるらしく、それが原因で以前の内容が使えなくなった可能性があります。そのため、今後また変わる可能性がありそうです。