前提・実現したいこと
複数のスプレッドシートのリンク共有を手動でするのが面倒なのでGASで自動化しようと思い、下記のURLを参考にコードを組みました。
https://auto-worker.com/blog/?p=447#toc_id_3
(上記の記事製作者に感謝します。)
しかしどうしても下記のエラーメッセージが表示されてしまい、上手くいかなくて困っております。
発生している問題・エラーメッセージ
Exception: Access denied: DriveApp. accessFree @ access Free.gs:31
該当のソースコード
/** *シートに記載されているスプレッドシートのURLを取得して *replace()でID部分以外を削除し、キーIDだけ抜き出し配列に格納するメソッド。 */ function getId() { const sh = SpreadsheetApp.getActiveSheet(); const getByUrl = sh.getRange(3,10,sh.getLastRow(),1).getValues(); const getByIdArray = []; for(let i = 0;i < getByUrl.length;i++){ const getId = String(getByUrl[i]); if(getByUrl[i] == 0) break; const getById = getId .replace("https://docs.google.com/spreadsheets/d/",'') .replace("/edit?ouid=[プライベート情報]",'') .replace("/edit#gid=0",''); getByIdArray.push([getById]); } return getByIdArray; //スプレッドシートのキーIDを取り出し、配列に格納する。 } function accessFree(){ const getByIdArray = getId(); console.log(getByIdArray); //エラー確認 1次配列で表示されるか確認。 let access; let permission; access = DriveApp.Access.ANYONE_WITH_LINK; permission = DriveApp.Permission.EDIT; for(let i = 0;i < getByIdArray.length;i++){ console.log(getByIdArray[i]); //エラー確認 DriveApp.getFileById(getByIdArray[i]).setSharing(access, permission); } }
試したこと
配列の取得がうまくいっていないのかと思い、配列取得のログを確認しましたが問題なく取得されていました。
要素の取り出しも問題ありませんでした。
試しに30行目の
.setSharing(access, permission);
を削除したところ問題なく動きましたので、おそらくこの部分のエラーなのだと思っています。
しかし自分の知識不足か何故「Access denied」というエラーが発生するのか理解できませんでした。
「Access denied GAS」で検索して色々な記事を読みましたが、残念ながら解決できませんでした。
accessに代入した構文もpermissionに代入した構文も間違っていないと思うのですが、、、
下記の記事を参考にしましたが、実行許可がでないままメソッドが動きました。
https://nac-chib.com/blog/how-to-fix-oauth-error-gas-and-bigquery/#GASBigQueryAccess_Denied_BigQuery_BigQuery_No_OAuth_token_with_Google_Drive_scope_was_found
(上記の記事内容を簡単に説明すると、DriveAppのAPIを呼び出すための許可ができていなかったので、その許可が出るような簡単なメソッドを構築し実行して許可をすることで解決したという記事内容です。)
是非ご教授のほどよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
V8ランタイム有効です。
先日リリースされた新しいほうのIDEを使って編集しております。
社内で利用するものになります。 すべてに公開という項目が無く、社内ユーザー限定でリンク共有されるようなビジネスアカウントで使っています。
回答1件
あなたの回答
tips
プレビュー