実現したいこと
Google Cloud FunctionsからGoogle Apps Scriptの関数を実行したいと思っています。
前提条件は以下の通りです。
- Cloud FunctionsはNode.jsで記述
- GASの関数名は「myFunctions」
- GCPプロジェクト内にサービスアカウントは作成済み
発生している問題・分からないこと
console.log
でエラーメッセージが返ってきます。(コード500)
書いているコードのどこがよくないのか分からなくて、修正しようがなく困っている状態です。
エラーメッセージ
error
1 { 2 message: 'Internal error encountered.', 3 domain: 'global', 4 reason: 'backendError' 5 }
該当のソースコード
Node.js
1const {google} = require('googleapis'); 2 3exports.stgVisitNotification = async (req, res) => { 4 try { 5 const scriptId = '****************'; 6 7 const clientEmail = "**********@developer.gserviceaccount.com"; 8 const privateKey = "-----BEGIN PRIVATE KEY-----\n**********\n-----END PRIVATE KEY-----\n"; 9 10 const auth = new google.auth.GoogleAuth({ 11 credentials: { 12 client_email: clientEmail, 13 private_key: privateKey, 14 }, 15 scopes: ['https://www.googleapis.com/auth/script.projects', 'https://www.googleapis.com/auth/script.external_request'], 16 }); 17 18 const script = google.script({ version: 'v1', auth }); 19 const result = await script.scripts.run({ 20 scriptId, 21 resource: { 22 function: 'myFunction', // Google Apps Scriptの関数名 23 }, 24 }); 25 26 console.log(result.data); 27 } catch (error) { 28 console.error(error); 29 } 30};
試したこと・調べたこと
上記の詳細・結果
元々サービスアカウントを別で作っていたのですが、Cloud Functionsは自動的にサービスアカウントが作成されることを知りました。
確認してみると確かにサービスアカウントが2つあり(自動で作られたものと、わざわざ作ったのも)、後者の認証情報をコードに書いてしまっていたので、前者のものに差し替えました。
...のですが、それでも解決せず...。
エラーメッセージは変わりませんでした。
補足
clientEmailやplivateKeyはコードにベタ打ちするんでなく、環境変数として持たせておく方がよいと思うのですが、今回は混雑回避のためベタ打ちのコードを使わせていただいています。
0 コメント