読者です 読者をやめる 読者になる 読者になる

よーやまブログ(PHPと自動化と語学と資格)

PHPと自動化と語学にハマったWebプログラマー。主にWebネタ、MySQL、Linux、Apache、語学をやるよ

【Google Apps Script】~を呼び出す権限がありませんと言われた時の解決法について調べてみた

JavaScript、Google Apps Script

どーも、よーやまです。

最近、PHPよりGoogle Apps Scriptのほうにドはまりしております。

さて、最近ちょっとつまずいたポイントをメモしました。

 

「~を呼び出す権限がありません」

こんな感じでコードを書いて!f:id:yohyama:20170307000027p:plain

 

ユーザー関数で呼ぼうとしたところ!

こんな感じで、「呼び出す権限がありません」と言われてしまいました。

 

f:id:yohyama:20170307000155p:plain

 

おかしいな~、おかしいな~、確かに実行許可もしているはずなのにな~(稲川淳二風)

と思って、色々と調べてみたところ!

 

公式ドキュメントにこんな注意書きが!

Advanced

Using Apps Script services

Custom functions can call certain Apps Script services to perform more complex tasks. For example, a custom function can call the Language service to translate an English phrase into Spanish.

Unlike most other types of Apps Scripts, custom functions never ask users to authorize access to personal data. Consequently, they can only call services that do not have access to personal data, specifically the following:

Supported servicesNotes
Cache Works, but not particularly useful in custom functions
HTML Can generate HTML, but cannot display it (rarely useful)
JDBC  
Language  
Lock Works, but not particularly useful in custom functions
Maps Can calculate directions, but not display maps
Properties  
Spreadsheet Read only (can use most get*() methods, but not set*()).
Cannot open other spreadsheets (SpreadsheetApp.openById() or SpreadsheetApp.openByUrl()).
URL Fetch  
Utilities  
XML  

If your custom function throws the error message You do not have permission to call X service., the service requires user authorization and thus cannot be used in a custom function.

To use a service other than those listed above, create a custom menu that runs an Apps Script function instead of writing a custom function. A function that is triggered from a menu will ask the user for authorization if necessary and can consequently use all Apps Script services

 

大雑把に訳すと以下の通り、

上級

Appsスクリプトサービスの使用

カスタム関数は、特定のApps Scriptサービス呼び出し て、より複雑なタスクを実行できます。たとえば、カスタム関数は、英語のフレーズをスペイン語に翻訳するために言語サービスを呼び出すことができます

他のほとんどのタイプのAppsスクリプトとは異なり、カスタム機能は、ユーザーに個人データへのアクセスを許可するよう要求することはありません。その結果、個人データにアクセスできないサービス、特に以下のサービスのみを呼び出すことができます。

サポートされるサービスノート
キャッシュ 動作しますが、カスタム関数では特に有用ではありません
HTML HTMLを生成することはできますが、表示することはできません(ほとんど役に立ちません)
JDBC  
言語  
ロック 動作しますが、カスタム関数では特に有用ではありません
地図 ルートは計算できますが地図は表示できません
プロパティ  
スプレッドシート 読み取り専用(ほとんどのget*()メソッドを使用できますが、使用できませんset*())。
他のスプレッドシート または)を開くことができませんSpreadsheetApp.openById()SpreadsheetApp.openByUrl()
URL取得  
ユーティリティー  
XML  

カスタム関数がエラーメッセージをスローしたYou do not have permission to call X service.場合、サービスはユーザーの承認を必要とするため、カスタム関数で使用することはできません。

上記以外のサービスを使用するには、カスタム関数を記述する代わりにApps Script関数を実行するカスタムメニュー作成し ます。メニューからトリガーされる関数は、必要に応じてユーザーに承認を求め、結果的にすべてのApps Scriptサービスを使用することができます。

 

ということで、ユーザー関数として呼び出す場合は使える関数が限られているのです!

今回はリターンで直接返すことが出来ないのです! 残念!

 

 

じゃあ、正しくはどう書けばいいの?

こんな感じでsetValueを使えばOKです!

f:id:yohyama:20170307001146p:plain

 

ちょっと癖がありますが、慣れれば簡単?