実現したいこと
【前提条件】
・GASでWebアプリを作成する。(作成者はWorkSpaceアカウント)
・利用者(一般Googleアカウント)がアクセスし利用する。
・ウェブアプリとしてデプロイする際、"次のユーザーとして実行"は"自分"とする
このとき、以下の機能を持たせたいです。
1.アクセスしたユーザーのメールアドレスを認識・判別
2.そのアドレスに応じて、returnする内容(HtmlService.createTemplateFromFile()の引数)を変更する
その後実装する機能としてSpreadSheetやDriveへアクセス・データ取得などが予定されており、
実行者を"ウェブアプリケーションにアクセスしているユーザー"にするとそのファイルやフォルダの権限を変更しなければならないが、都合により変更してはならない状況です。
この時に、実現可能な手段と手順を知りたいです。
発生している問題・分からないこと
Session.getActiveUser().getEmail()でメールアドレスを取得しようと思ったが、
その場合"次のユーザーとして実行"は"ウェブアプリケーションにアクセスしているユーザー"
としなければ取得できないらしい。
上記にも記載しましたが、その後実装する機能としてSpreadSheetやDriveへアクセス・データ取得などが予定されており、実行者を"ウェブアプリケーションにアクセスしているユーザー"にするとそのファイルやフォルダの権限を変更しなければならないようですが、都合により変更してはならない状況です。
GCPの機能を何か利用して…?と考えましたが、知識不足により少し難しい状態です。
GASで試したこと
・Session.getActiveUser().getEmail()
→不可とする
・設定画面GCPプロジェクトに下記作成のプロジェクト番号設定
GCPで試したこと
・GCPプロジェクト作成
・OAuth2.0クライアントID作成
(承認済みのJavaScript生成元にhttps://script.google.com)を設定
・OAuth同意画面作成
(公開ステータス:テスト,
ユーザーの種類:外部,
テストユーザー: 作成者WorkSpaceアドレス,テスト用アドレス)
・API有効化
AppsScriptAPI
GoogleDriveAPI
GoogleSheetsAPI
下記、該当のソースコードというよりは
こういう処理が望ましい(想定していた)というもの。
該当のソースコード
javascript
1function doGet(e) { 2 3 //メールアドレスを取得する 4 5 //特定のアドレスならページAへ 6 7 //そうでない場合は登録ユーザー取得API呼び出し 8 9 //登録ユーザーでなければエラーページへ 10 11 //登録ユーザーであればページBへ 12 13} 14 15
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Session.getActiveUser().getEmail()でメールアドレスを取得しようと思ったが、
その場合"次のユーザーとして実行"は"ウェブアプリケーションにアクセスしているユーザー"
としなければ取得できないらしい。
補足
特になし
###追記
コメントを参考に、
Session.getActiveUser().getEmail()を使いアドレスを取得するWebアプリと
その取得アドレスを受け取って必要なものを返すWebアプリとに分割しました。
その上で新たな問題が発生したので追記します。
本来の質問とかけ離れているようでしたら新たに質問を投稿します。
追記のソースコード
javascript
1 2//入口.gs 3function doGet(e) { 4 5 const uri="本体.gsのウェブアプリ" 6 7 const option={ 8 "method":"post", 9 "payload":JSON.stringify({'email':Session.getActiveUser().getEmail()}), 10 "contentType":"application/json" 11 } 12 13 const response= UrlFetchApp.fetch(uri,option) 14 15//ここでリターンするものがうまくいかない。 16//HtmlService.createHtmlOutput(response.getContentText())だと真っ白になる 17 18//とりあえず 19//ContentService.createTextOutput(response.getContentText()).setMimeType(ContentService.MimeType.HTML); 20//で中身だけ表示している 21 22 return ContentService.createTextOutput(response.getContentText()).setMimeType(ContentService.MimeType.HTML); 23 24 25} 26
追記のソースコード2
javascript
1 2//本体.gs 3function doPost(e) { 4 5 6 const testAddress="(特定アドレス)" 7 8 const data = JSON.parse(e.postData.contents); 9 const email = data.email; 10 11 let html=HtmlService.createTemplateFromFile("Error") 12 13 if(email===testAddress){ 14 let testSheet=SpreadsheetApp.openById("開発者アドレス(testAddressではない)でしかアクセスできないSpreadSheetのID") 15 let testName=testSheet.getName() 16 html=HtmlService.createTemplateFromFile("TEST") 17 html.accesstest=testName 18 } 19//email===testAddressのとき 20//testSheetの名前にアクセスできているので本来の目的は達成と判断 21 22 return html.evaluate(); 23 24}
回答1件
あなたの回答
tips
プレビュー