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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

2回答

9202閲覧

SpreadsheetApp.openByIdのパーミッションエラーが解消できません

jgnet

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

0クリップ

投稿2022/08/10 09:41

前提

Googleフォームと紐づけられたスプレッドシートに、
回答をわかりやすく配置したシートを作成するスクリプトを作成しています。
Exception: You do not have permission to call SpreadsheetApp.openById. Required permissions:
というエラーが出てしまいます。
指定しているIDは、拡張機能を選択したスプレッドシートのものです。

このスプレッドシートにはマクロ(ソートするだけの)を入れており、
スクリプトを作成しようとすると、マクロ.gsというファイルが開かれます。
現在はそこにある2つのマクロの下にform(e) という関数を記載しています。

マクロもそのまま使用し、今回の配置するだけのスクリプトも動くようにしたいです。
原因がわからず困っております。教えて頂けるととても助かります。
よろしくお願い致します。

発生している問題・エラーメッセージ

Exception: You do not have permission to call SpreadsheetApp.openById. Required permissions:

該当のソースコード

GAS

1ソースコード 2/** @OnlyCurrentDoc */ 3 4function myFunction() { 5 var spreadsheet = SpreadsheetApp.getActive(); 6 spreadsheet.getRange('A:K').activate(); 7 spreadsheet.getActiveRange().offset(1, 0, spreadsheet.getActiveRange().getNumRows() - 1).sort([{column: 2, ascending: true}, {column: 3, ascending: true}, {column: 4, ascending: true}, {column: 1, ascending: true}]); 8}; 9 10function myFunction1() { 11 var spreadsheet = SpreadsheetApp.getActive(); 12 spreadsheet.getRange('A:K').activate(); 13 spreadsheet.getActiveRange().offset(1, 0, spreadsheet.getActiveRange().getNumRows() - 1).sort({column: 1, ascending: true}); 14}; 15 16 17function form(e) { 18 19var timestamp = e.namedValues['タイムスタンプ']; //タイムスタンプ 20var t_name1 = e.namedValues['社員名']; //社員名 21var b_date = e.namedValues['勤務日']; 22var b_time = e.namedValues['開始時刻'];//開始時刻のみ変更 23var memo = e.namedValues['連絡事項']; 24var except = e.namedValues['授業以外の勤務']; 25 26var ss_id = 'シートのID'; //スプレッドシートのIDを指定 27var sh_name = '打刻一覧'; //スプレッドシートのシート名を指定 28var sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name); 29var last_row = sh.getLastRow(); 30 31sh.getRange(last_row + 1, 1).setFontColor("black").setValue(timestamp); 32sh.getRange(last_row + 1, 2).setFontColor("black").setValue(t_name1); 33sh.getRange(last_row + 1, 3).setFontColor("black").setValue(b_date); 34sh.getRange(last_row + 1, 4).setFontColor("black").setValue(b_time); 35sh.getRange(last_row + 1, 5).setFontColor("black").setValue(except); 36sh.getRange(last_row + 1, 6).setFontColor("black").setValue(memo); 37 38 39} 40 41 42### 試したこと 43 44トリガーを設定しなおしました 45 46### 補足情報(FW/ツールのバージョンなど) 47 48ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

冒頭の

/** @OnlyCurrentDoc */

というコメント(アノテーション) を削除してみてはいかがでしょうか。(別のgsファイルなど、複数箇所に記述されている場合は、すべての箇所を削除)

この「@OnlyCurrentDoc」というアノテーションは、マクロの記録時に自動的に付加されます。
このアノテーションが記述されていると、そのスクリプトが使用されているスプレッドシート(※)以外にアクセスできなくなってしまうようです。
このため、openById で他のスプレッドシートを取得しようとしたときに permission error が発生すると考えられます。

フォームに紐付けたスプレッドシートで同じスクリプトを試したところ、openByIdに指定したスプレッドシートIDが「そのスクリプトが使われているスプレッドシートのID」であったとしても、上記のアノテーションを付けているとエラーが発生しました。

参照:
https://developers.google.com/apps-script/guides/services/authorization#manual_authorization_scopes_for_sheets_docs_slides_and_forms


【パーミッション追加手順】

① 左の歯車マークをクリックして、
"「appsscript.json」マニフェスト ファイルをエディタで表示する" にチェックを入れる。
イメージ説明

② エディタの「appsscript.json」を開く
イメージ説明

③ appsscript.json の後半に、下記のように パーミッション( 「, oauthScopes 」以下3行)を追加する。(追加時に、oauthScopesの前にカンマをつけるのを忘れないこと)

{ "timeZone": "Asia/Tokyo", "dependencies": {}, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8", "sheets": { "macros": [ {   ....略......... } ] } , "oauthScopes": [ "https://www.googleapis.com/auth/spreadsheets" ] }

以上を行って、保存した場合はどうでしょうか。

投稿2022/08/10 15:23

編集2022/08/10 16:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jgnet

2022/08/10 15:51

ありがとうございます。 やってみましたが解消されないようです。 また取得しようとしているのはそのスクリプトを使用しているスプレッドシートなんです。 それなのに取得できず困っています。
jgnet

2022/08/10 16:05

回答の補足を頂きありがとうございました。 そうなんですね。 でも外してみたのですがまだエラーになってしまいます。  困りました
退会済みユーザー

退会済みユーザー

2022/08/10 16:15

パーミッションの追加手順について追記しました。これを試してみてください。
jgnet

2022/08/10 16:30

ありがとうございます。 試してみましたがまだ解消されません。 さきほど設定されているトリガーの編集マークをクリックして、内容を確認して保存しようとしましたら、 注意のマークと共に、Google hasn’t verified this app The app is requesting access to sensitive info in your Google Account. Until the developer (******@gmail.com) verifies this app with Google, you shouldn't use it. というメッセージが出ました。関係ありますでしょうか
jgnet

2022/08/10 17:03

基本的な質問をもうひとつさせてください。 別のスプレッドシートで使用しているスクリプトで、同じ名前のform(e)というものを使用しています。 内容的には異なるものです(似ていますが回答内容が異なるので同じではありません)。 それ自体は問題ではないでしょうか。
退会済みユーザー

退会済みユーザー

2022/08/10 21:31

通常、他のプロジェクトに同名の関数があることは問題にはならないと思います。 こちらの手元では、同じコードで同様の状況(アノテーションの削除やパーミッションの追加を行ってもエラーが解消されない、という状況)を再現することができませんでした。 コード特有の原因というよりも何らかの原因で関係するファイルのパーミッション設定がおかしくなっている状態が固定してしまっていることが考えられるため、いったん「Googleのすべてのアカウントからログアウト」を行い、ログインしなおしてスクリプトと関係するファイルを新しく作り直す、くらいしか思いつきません。(作り直す負担を考えると現実的ではないかもしれませんが) お役に立てず申し訳ございません。
jgnet

2022/08/10 23:07

教えて頂いたアノテーションの削除やパーミッションの追加を実行しました後にトリガーの修正をたところ、 「Google hasn’t verified this app」のメッセージが出ていましたが、 同じ関数名があっても大丈夫ということでそちらを進めましたところ、エラーが解消され動作されました!! 本当に助かりました。感謝申し上げます。
guest

0

エラーの文言の通りなのですが、スプレッドシートの共有設定がされていないためにエラーになっています。

トリガーを設定したGoogleアカウントが、
ss_idに該当するスプレッドシートの共有設定にあるか確認ください。

一度、トリガーを消して、やり直した方がわかりやすいと思います。

JavaScript

1var ss_id = 'シートのID'; //スプレッドシートのIDを指定 2var sh_name = '打刻一覧'; //スプレッドシートのシート名を指定 3var sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name);

投稿2022/08/10 10:15

A00021

総合スコア128

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

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

jgnet

2022/08/10 10:52

ありがとうございます。 私のアカウントでGoogleフォーム、スプレッドシートを作成していて(オーナーです)、 トリガーの設定はそのスプレッドシートの拡張機能→Apps Scriptから開いてスクリプトを書いています。 それで共有設定にないということはあるのでしょうか? 初心者で申し訳ありません
A00021

2022/08/10 12:22 編集

であれば、スプレッドシートのIDが誤ってるのではないでしょうか?
jgnet

2022/08/10 15:16

IDは正しいようで困っております・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問