質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

815閲覧

GASでエラー`Exception: You do not have permission to call SpreadsheetApp.openByUrl`が発生する

yaxavr

総合スコア40

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2024/10/23 12:13

編集2024/10/23 12:47

jsは一通り書けるつもりですが、GASは初心者です。
Googleスプレッドシートで他のスプレッドシートを参照して、結果を返すユーザ関数を書こうとしています。

セルO2 には=test3()と入力しており、結果の期待値としてbb2が入るはずなのですが、実際は下記エラーとなります。

Exception: You do not have permission to call SpreadsheetApp.openByUrl. Required permissions: https://www.googleapis.com/auth/spreadsheets

エラー画面

このエラーを検索すると、App Scriptエディタにappsscript.jsonを追加して、そこにoauthScopesというキーでエラーで示されているURLを追加すればよいとありましたので、そのとおりにしました。

しかし、結果は変わらず、エラーメッセージにも変化は見られません。

参考にしたページによると、appsscript.jsonを追加して一度スクリプトを実行すると、「承認が必要です」というダイアログが開き、そこで権限を付与する手順となっていましたが、そのようなダイアログは表示されませんでした。

エラーの原因は、おそらく参照先のスプレッドシートに権限が付与されていないためではないかと思いますが、このダイアログが表示されないため行き詰まっている状態です。

スプレッドシートを新規作成して3回ほど同じ手順を試してみましたが、やはり同じ現象です。

あと試したこととして、問題が起きているtest3()関数をApp Scriptエディタ上で実行デバッグすると期待通りにbb2が返ることを確認しています。

このような現象に遭遇された方がおられましたらアドバイスいただけますと助かります。
よろしくお願いいたします。

  • appsscript.json

json

1{ 2 "timeZone": "Asia/Tokyo", 3 "dependencies": { 4 }, 5 "oauthScopes": [ 6 "https://www.googleapis.com/auth/spreadsheets" 7 ], 8 "exceptionLogging": "STACKDRIVER", 9 "runtimeVersion": "V8" 10}
  • 問題のスクリプト

js

1const DB_Master = 'https://docs.google.com/spreadsheets/d/16AbcQ9HXfe_A_Bgz4nfPWMEMvu_ACCIN-pRrWjxVhQY/edit'; 2 3// ------------------------------------ 4// マスタDBのOPをnameで検索してその行を取得 5function find_values(lines, v, col) { 6 for (const i in lines) { 7 if (lines[i][col] == v) return lines[i]; 8 } 9 10 return false; // not found 11} 12 13// マスタDBのOPをnameで検索してその行を返す 14function search_db_op(code_name) { 15 const ss = SpreadsheetApp.openByUrl(DB_Master); 16 const sheet = ss.getSheetByName('OP'); 17 const vals = sheet.getRange('A2:AG').getValues(); 18 19 const search_col = 4; // for name 20 return find_values(vals, code_name, search_col); 21} 22 23function test3() { 24 const dat = search_db_op("bar"); 25 const ret = dat[6]; 26 console.log(ret); 27 return ret; 28}
  • App Scriptエディタ上でのtest3()の実行結果

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2024/10/24 02:59

こちらの[ドキュメント](https://developers.google.com/apps-script/guides/sheets/functions?hl=ja#advanced)に > スプレッドシート 読み取り専用(ほとんどの get*() メソッドを使用できますが、set*() は使用できません)。 > 他のスプレッドシート(SpreadsheetApp.openById())を開くことはできません または SpreadsheetApp.openByUrl())。 という記述があります。
guest

回答1

0

ベストアンサー

YAmaGNZさんがコメントしていただいているように、
スプレッドシート上で利用する関数でSpreadsheetApp.openById()などは利用できません。

代替案としては、セキュリティ的に可能であればですが、
GAS(Google Apps Script)がバインドされているスプレッドシートに
IMPORT用のシートを作成しデータをIMPORTします。

下記のように関数でデータを取得する、またはGASで定期的にデータを同期させるなどします。

=IMPORTRANGE("DB用スプレッドシートのURL", "OP!A:AG" )

その後、下記のように自身のスプレッドシートのシートからデータを取得するようにすれば
やりたいことは実現できるかなと思います。

javascript

1// マスタDBのOPをnameで検索してその行を返す 2function search_db_op(code_name) { 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getSheetByName('IMPORT_OP'); // データをインポートしたシート名 5 const vals = sheet.getRange('A2:AG').getValues(); 6 7 const search_col = 4; // for name 8 return find_values(vals, code_name, search_col); 9}

シートを保護したり、非表示にするなどすれば、運用に支障はないかなと思います。
どうしても見せられないデータなどであれば上記の方法ではリスクがあるので、
別途方法を検討する必要があります。
要件に合わせてご検討ください。

投稿2024/10/24 03:19

dadadaiiiiiii

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yaxavr

2024/10/24 08:14 編集

詳細な説明ありがとうございました。 なるほど、ユーザがGASで書いた関数をスプレッドシートのセルに書いて呼び出すと「カスタム関数」というの扱いになるのですね。 で、`openByUrl()`を使った関数もスプレッドシートのセルから呼び出すと、もうその関数はカスタム関数なので、カスタム関数で使用不可な'openByUrl()'メソッドを呼んだ時点でエラーが発生する、ということですね。 だからGASのエディタから`実行`すると期待通り動作するけど、セルに書いて呼び出そうとするとこのエラーが出るということですね。ようやく理解できました。 どうやら私には、このエラーメッセージからその内部動作を察したり、YAmaGNZさんに示していただいた公式ドキュメントの意味を理解する力が足りなかったようです。 おかげさまで、解決できそうです。 ありがとうございました。
dadadaiiiiiii

2024/10/24 08:58

解決できそうとのことでよかったです! カスタム関数は便利な所もあるのですが、下記の記事で説明されているような制限や注意点もあります。 https://qiita.com/uramotot/items/19b8baa2fb9c4f4109c7 カスタム関数以外にも時間トリガーやメニューからの実行など代替案もいろいろと考えられますので 要件に合わせて最適な方法を検討してみると面白いかなと思います!
yaxavr

2024/10/25 00:40

ご教示いただいたqiitaの記事をブックマークしました(これは永久保存版です)。 js書けるならと気軽にGASを始めましたが、やはりGoogleスプレッドシート特有の制限があることがよくわかりました。 今回の場合は「カスタム関数」という用語をはっきり認識してなかったことで、公式のドキュメントを読んでもピンと来ませんでした。 人様のブログ記事を読むのもいいですが、トラブったときはやはり公式ドキュメントをしっかり読むべきだと痛感しました。 ご親切に感謝します。これからもGASやっていきたいと思います!
yaxavr

2024/10/25 00:40

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問