Googleスプレッドシートで、選択したセル範囲の文字列(URL)をハイパーテキストに変換するためのGoogle Apps Script(GAS)を組んでいる時に出会った事象です。公式ドキュメントで書かれていることとは違う挙動を見つけたので、ご紹介します。
/*
* OAuth scopeを
* https://www.googleapis.com/auth/spreadsheets.currentonly
* に設定している場合
*/
// 選択されているセル範囲を取得する
const selectedRangeListNg = SpreadsheetApp.getActiveRangeList()
// 「Exception: その操作を実行する権限がありません。」
const selectedRangeListOk = SpreadsheetApp.getActiveSpreadsheet().getActiveRangeList()
// これなら普通に取得できる
Google Issue Trackerで類似事例へのコメントとして追記しておきましたが、そもそもその事例に対するIssue Tracker内の動きが1年半ほどないことから、しばらくは現状のままでしょう。
結論
スプレッドシートで選択中のセル範囲(複数可)を呼び出すためのメソッドSpreadsheetApp.getActiveRangeList()
は、OAuthのスコープがhttps://www.googleapis.com/auth/spreadsheets
(すべてスプレッドシートに対する閲覧・編集権限)でないと実行できません。
公式ドキュメントでは許容されていることになっているhttps://www.googleapis.com/auth/spreadsheets.currentonly
(現在開いているスプレッドシートに対する閲覧・編集権限)ではException: その操作を実行する権限がありません。
とエラーが返ってきます。
回避方法
そもそもマニフェストファイルappsscript.json
でOAuthスコープを指定しないのであれば、この問題は発生しません。Apps Script側が自動的に../auth/spreadsheets
でユーザ承認を要求するためです。ベストプラクティスに従ってマニフェストファイルで必要最小限のOAuth権限だけを取得するようにしている優等生(笑)だけがこの問題にひっかかるわけです。
OAuth権限を変更せずに回避するならば、
SpreadsheetApp.getActiveRangeList()
を
SpreadsheetApp.getActiveSpreadsheet().getActiveRangeList()
と書き換えればいいです。いったんSpreadsheet
オブジェクトとして現在開いているスプレッドシートを取得した上で、(SpreadsheetApp
ではなく)Spreadsheet
のメソッドとしてgetActiveRangeList
を呼び出せばいいということでしょう。
同様の制約があるメソッドが他にもありそう。getCurrentCell()
など
Google Issue Trackerでも同様の報告はされており、SpreadsheetApp.getCurrentCell()
も同様に公式ドキュメントで書かれているcurrentonly
スコープでは権限エラーを返されてしまうようです。
検証していませんが、SpreadsheetApp
から直接呼び出されるメソッドの一部に共通する事象かもしれません。ただ、上記Issueの報告日を見ると2020年10月で、2022年5月現在も担当がassignされていない... 今後も大きな動きはあまり期待できないでしょう。