rpachen17
@rpachen17

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Google Sheets API を使ってOAuth 2.0 クライアント IDで認証の時401エラー(UNAUTHENTICATED)が出ました。

解決したいこと

Node.jsにおいて下記のGoogle Sheets APIを使用し、公開しているGoogleSheetのあるシートを別のシートにコピーしようとしましたが、エラーレスポンスが返ってきてコピーできない状態です。これを解決しようとしています。
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo

発生している問題・エラー

npmモジュールである"sync-fetch"と"googleapis"モジュールを使用し、Googleに対しPOSTリクエストを行いましたが、そのレスポンスが"UNAUTHENTICATED"で返ってきてしまいます。

{
  error: {
    code: 401,
    message: 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
    status: 'UNAUTHENTICATED'
  }
}

構成図

├── node_modules
├── package.json
├── index.js
└── app
    └── googleSheetApi.js

該当するソースコード

index.js

const spreadSheets = require('./app/googleSheetApi.js')
const credentials = 'credentialsファイルのフルパス';
const token = 'tokenファイルのフルパス';
const sheetId = 2014670255;

spreadSheets.syncfetch(credentials, token);

googleSheetApi.js

const { google } = require('googleapis');
const fs = require('fs');
const syncfetch = require('sync-fetch')

//googleのOAuth 2.0 クライアント IDで認証
function authorize(credentialPath, tokenPath) {
  //事前に用意したcredential、tokenのファイルを読み込み
  const credentials = JSON.parse(fs.readFileSync(credentialPath));
  const token = JSON.parse(fs.readFileSync(tokenPath));
  const { client_secret, client_id, redirect_uris } = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
  oAuth2Client.setCredentials(token)
  return oAuth2Client;
}


const apis = {
  syncfetch: (credentialPath, tokenPath) => {

    const req = {
      "requests": [
        {
          "destinationSpreadsheetId": 'destinationSpreadsheetId'
        }
      ]
    }

    const authClient = authorize(credentialPath, tokenPath);
    const response = syncfetch('https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/sheets/{range}:copyTo', {
      method: 'POST',
      headers: {
        //間違っているのはこちらの認証ステップだと思います。
        //認証の情報はどうやって送るか分からないです。
        'Authorization': authClient,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(req)
    })

    const json = response.json()
    console.log(json)
    return JSON.stringify(json.responses)
  }
}

module.exports = apis;

自分で試したこと

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo
Googleのサイト上のNode.jsのサンプルコードを参考にして、非同期処理ではシートのコピーは成功しましたが、今回の同期処理のPOSTリクエストではコピーに失敗している状態です。

0

No Answers yet.

Your answer might help someone💌