備忘録

備忘録

Sheets APIを利用してスプレッドシートに値を書き込む方法

Ⅰ. はじめに

タイトルの通り「Sheets APIを利用してスプレッドシートに値を書き込む方法」です。

Ⅱ. やり方

1. Google Developers Consoleにアクセスする

https://console.developers.google.com/?hl=ja

2. 新しいプロジェクトを作成する

f:id:kagasu:20180114224251p:plain

3. ライブラリを選択する

f:id:kagasu:20180114224350p:plain

4. Google Sheets API を有効にする

f:id:kagasu:20210524213938p:plain

5. 認証情報をクリックする

f:id:kagasu:20180114224554p:plain

6. OAuth クライアント IDを作成する

f:id:kagasu:20210524214111p:plain

7. 「デスクトップアプリ」を選択し、任意の名前をつける

f:id:kagasu:20210524214148p:plain

8. 「クライアントID」と「クライアントシークレット」をメモする
9. サンプルプログラムを書く
var fetch = require('node-fetch');

const clientId = 'xxx-yyy.apps.googleusercontent.com'
const clientSecret = 'xxx'
const redirectUri = 'urn:ietf:wg:oauth:2.0:oob'
const scope = 'https://www.googleapis.com/auth/spreadsheets'

async function getRefreshTokenFromCode (code) {
  const res = await fetch('https://www.googleapis.com/oauth2/v4/token', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      client_id: clientId,
      client_secret: clientSecret,
      code: code,
      redirect_uri: redirectUri,
      grant_type: 'authorization_code',
      access_type: 'offline'
    })
  })

  const obj = await res.json()
  return obj.refresh_token
}

async function getAccessTokenFromRefreshToken (refreshToken) {
  const res = await fetch('https://www.googleapis.com/oauth2/v4/token', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      client_id: clientId,
      client_secret: clientSecret,
      grant_type: 'refresh_token',
      refresh_token: refreshToken
    })
  })

  const obj = await res.json()
  return obj.access_token
}

async function writeSingleCell (accessToken, sheetId, sheetName, cell, value) {
  const url = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/'${sheetName}'!${cell}?valueInputOption=USER_ENTERED`

  const res = await fetch(encodeURI(url), {
    method: 'put',
    headers: {
      Authorization: `Bearer ${accessToken}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      majorDimension: 'COLUMNS',
      values: [ [ value ] ]
    })
  })

  const obj = await res.text()
  return obj
}


(async () => {
  let url = `https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=${clientId}&redirect_uri=${redirectUri}&access_type=offline&scope=${scope}`
  // 表示されたURLにアクセスして手動でコードを取得する
  console.log(url)

  // codeは1回のみ使用可能
  // const code = '4/1A...'
  // const refreshToken = await getRefreshTokenFromCode(code)
  // console.log(refreshToken)

  // refreshTokenをメモする事。
  // 2回目以降はrefreshTokenを利用してaccessTokenを生成する事が出来る
  // const refreshToken = '1//...'
  const accessToken = await getAccessTokenFromRefreshToken(refreshToken)
  console.log(accessToken)

  const sheetId = 'xxx'
  await writeSingleCell(accessToken, sheetId, 'シート1', 'A1', 100)
})()

実行結果

A1に100が書き込まれた
f:id:kagasu:20210524214640p:plain