Google App ScriptでGoogleDriveと接続してアプリを開発したい。
そう思って、プロトタイプというか、骨子をChatGPTに作らせたのです。
使ったGoogleDriveのモジュールはDriveApp。
GoogleCloudのAPI認証設定もして、APIキーとOAuth 2.0 クライアント IDも作りました。テストコード書いて(後述)実行したら、以下のエラーが出ました。
エラー 400: redirect_uri_mismatch
このアプリは Google の OAuth 2.0 ポリシーを遵守していないため、ログインできません。
このアプリのデベロッパーの方は、Google Cloud コンソールで JavaScript オリジンを登録してください。
リクエストの詳細: origin=https://n-ran6u6zgj5zvijvckcfydy4r24vyaohw3xd2q2a-0lu-script.googleusercontent.com flowName=GeneralOAuthFlow
一見クライアントIDの承認済みの JavaScript 生成元に上記のリクエストの詳細のURI入れれば良いじゃんと思うじゃないですか。
違います。この部分は無視してください。
もちろん、外部からGAS呼び出して処理しているのならそうかもしれませんが(未確認)、今回は単独でGASの実行をします。さて、何を入力したら良いか?
承認済みの JavaScript 生成元は「https://script.google.com」を
承認済みのリダイレクト URIは「https://script.google.com/macros/d/<スクリプトID>/usercallback」
を入れます。
スクリプトIDはエディタでサイドバーの歯車アイコンをクリックして「プロジェクトの設定」を表示します。その中にスクリプトIDがあります。あ、アプリの種別はウェブアプリケーションです。
以上で、エラーの対応は終了。5分から数時間待ってください(謎
じゃあ、確認方法ですが、まず、スクリプトIDが表示されている下部にスクリプトプロパティという、シークレット記号を格納できる部分があります。そこに、CLIENT_IDと、CLIENT_SECRETを入れます。
CLIENT_IDと、CLIENT_SECRETはクライアントIDの画面に載ってます(見つからないときはブラウザ最大化してください)
コード.gs
// OAuth2 サービスを設定する関数
function getOAuthService() {
return OAuth2.createService('GoogleDrive')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setClientId(PropertiesService.getScriptProperties().getProperty('CLIENT_ID'))
.setClientSecret(PropertiesService.getScriptProperties().getProperty('CLIENT_SECRET'))
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties())
.setScope('https://www.googleapis.com/auth/drive')
.setParam('access_type', 'offline')
.setParam('prompt', 'consent');
}
// ウェブアプリケーションのエントリーポイント
function doGet(e) {
var service = getOAuthService();
if (!service.hasAccess()) {
var authorizationUrl = service.getAuthorizationUrl();
var template = HtmlService.createTemplate(
'<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>. ' +
'Reopen the sidebar when the authorization is complete.');
template.authorizationUrl = authorizationUrl;
return template.evaluate();
} else {
// 認証済みの場合、Google Driveの操作を行う
return HtmlService.createHtmlOutput('認証済み。Google Driveにアクセスできます。');
}
}
// OAuth コールバック関数
function authCallback(request) {
var service = getOAuthService();
var authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('認証成功!このページを閉じてください。');
} else {
return HtmlService.createHtmlOutput('認証に失敗しました。');
}
}
// Google Driveの操作を行う関数の例
function listFiles() {
var service = getOAuthService();
if (service.hasAccess()) {
var url = 'https://www.googleapis.com/drive/v3/files';
var response = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
}
});
var result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));
} else {
Logger.log('認証が必要です。');
}
}
クライアントIDの画面にある、「appsscript.json」マニフェスト ファイルをエディタで表示する、のチェックボックスをオンへ。するとappsscript.jsonが編集できるようになります。
appsscript.json
{
"timeZone": "Asia/Tokyo",
"dependencies": {
"enabledAdvancedServices": [
{
"userSymbol": "Drive",
"serviceId": "drive",
"version": "v2"
}
],
"libraries": [
{
"userSymbol": "OAuth2",
"libraryId": "1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF",
"version": "38"
}
]
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/drive"
],
"webapp": {
"executeAs": "USER_DEPLOYING",
"access": "MYSELF"
}
}
この2つを保存し、デプロイして、リンク踏んで実行すると確認画面がでます。
いじょ。ChatGPTは役に立たず、perplexityという検索型AI使って解決しました。cradleは落ちてるし、Geminiは答えを返してくれないし、プロが答えるサイトに500円課金して聞いたけど返答が無かった。web検索しても情報が出てこなくて困りました。
後から調べたら、認証エラーはデプロイ方法(個人に限定してたのを広げた)や、スコープの設定が甘かったとか微妙な違いによるものと判明。GASに関する認証エラーであって、GoogleDriveのものではなかったらしい。
コメント