あるエンジニアのGoogleアカウントオーナーで動いていたGoogleAppsScriptを引き継いだがスクリプト所有権が変わったためそのスクリプトを利用していたバッチ処理が次々と動かなくなってしまった。対処方法をメモしておく。基本的には認証情報を正しいものに書き換えてあげれば動き出すはずだがトークンが古くなってしまっているため再発行が必要になる。
GoogleAppsScriptの複製
まず無題の新規プロジェクトを作成し、既存のコードの内容を貼り付けて保存してしまう
"GoogleDrive" → "新規" → "GoogleAppsScript"
既存のコードを新規 プロジェクトに貼り付け保存する
もしくはファイルを複製する
ひとつひとつ修正していく手段もあるが作り直してしまったほうが早いと判断
情報収集
プロジェクト(スクリプト)の一意な認証情報などを収集する
- "GoogleDrive" → "プロジェクト(スクリプト)を右クリック" → "アプリで開く" → "GoogleAppsScript"
- "ファイル" → "プロジェクトのプロパティ"
- プロジェクトキー:MkBVBECXF_-hQi8ffeQsUZ5fOkIAXXXXX(例)
- スクリプト ID:1tAkxOWU-XDcfkGAJe1G_HSW9hmLw7nkNt-3qWuwABoPYRm4cyuNXXXXX(例)
- "リソース" → "Developers Consoleプロジェクト..." → "API Manager"画面を開く
"認証情報"→"Apps Script" - クライアント ID:3930309XXXXX-h2jag0253e6q6d39bbn0vthq9pjXXXXX.apps.googleusercontent.com(例)
- クライアント シークレット:RHqmnHOSSbFdkLugSbhXXXXX(例) ※"シークレットをリセット"で変更可
API有効化
"API Manager"画面→"ライブラリ"→"Google Apps Script Execution API"で検索→"Google Apps Script Execution API"をクリック→"有効化"をクリック
ライブラリ有効化
"リソース"→"ライブラリ"→"ライブラリを検索"
例えばChatworkAPIを使用する場合はプロジェクトキー"M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT"を検索しバージョンを最新のものを選択し「保存」をクリック
認証コード取得
client_id=以降を書き換えて以下のようにブラウザでアクセスする
auto
https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=https%3A%2F%2Fscript.google.com%2Foauthcallback&client_id=39303096XXXXX-h2jag0253e6q6d39bbn0vthq9pjXXXXX.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.external_request&access_type=offline&approval_prompt=auto
force
https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=https%3A%2F%2Fscript.google.com%2Foauthcallback&client_id=3930309XXXXX-h2jag0253e6q6d39bbn0vthq9pjXXXXX.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.external_request&access_type=offline&approval_prompt=force
- "スクリプト名"が次のリクエストしています画面にて「許可」をクリック
- リクエストされたファイルは存在しません。画面が表示されるが、その画面のURLのcode="~"#の~部分が認証コードとなる
取得した認証コード
4/FT9xgav9Y8Hc1ftNQ6rInYHmh-rXv0wHvPwU1BXXXXX
アクセストークンとリフレッシュトークン取得
$ curl -d client_id=3930309XXXXX-h2jag0253e6q6d39bbn0vthq9pjXXXXX.apps.googleusercontent.com \
> -d client_secret=RHqmnHOSSbFdkLugSbhXXXXX \
> -d redirect_uri=https%3A%2F%2Fscript.google.com%2Foauthcallback \
> -d grant_type=authorization_code \
> -d code=4/v3DBBc_cyBUQB0aIemwGWG3JBJeP2dhPG8nouIXXXXX https://accounts.google.com/o/oauth2/token
{
"access_token" : "ya29.Ci9qA_CaeZjBcfABtaULa0KLmR2Zxy5wz9vd4ZLkRRvFwRbMpj9X6W80fL6ifXXXXX",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/ROwYk8-yHnFJXWocZVDIlTbBEu5kJzvFCiTTRXXXXX"
}
リフレッシュトークンでアクセストークンを取得
$ curl -X POST https://accounts.google.com/o/oauth2/token \
> -d "refresh_token=1/pBTVup7HFGyM27fmqe-fLGTQQE_LQwm7Iip-38XXXXX" \
> -d "client_id=3930309XXXXX-h2jag0253e6q6d39bbn0vthq9pjXXXXX.apps.googleusercontent.com" \
> -d "client_secret=RHqmnHOSSbFdkLugSbhXXXXX" \
> -d "grant_type=refresh_token"
{
"access_token" : "ya29.Ci9qAyAZs5wrgTLcP04SifCNBlzZa0S290EaV3n4TTu6t7VubJVmFrnh98SqXXXXX",
"token_type" : "Bearer",
"expires_in" : 3600
}
エラー出力例
既にアクセストークンが発行されている場合
{
"error" : "invalid_grant",
"error_description" : "Code was already redeemed."
}
アクセストークンの有効期限が切れている場合
{
"error" : "invalid_grant"
}
リフレッシュトークンだけが発行されない場合
原因はよくわかっていないがこの場合認証コードを取得しなおしてもう一度アクセストークン取得してみると改善したりする
{
"access_token" : "ya29.CjBqA4Vvj-HCOq791ZcZ7zrCXq4tE17u-ghBV8sdjWoKyFwFETws98QYO8cupDXXXXX",
"token_type" : "Bearer",
"expires_in" : 3490
}