Help us understand the problem. What is going on with this article?

Googleスプレッドシートに書き込み処理(node.js)

はじめに

Googoleスプレッドシートにプログラミングで書くとしたら大抵Google Apps Scriptで書けばいいと思いますが今回はJavascript(node.js)の勉強とGoogleAPIを弄りたかったのでnode.jsで書き込み処理をしたいと思います。

開発環境

  • Node.js v6.11.1
  • GoogleAPI v4

API取得

Node.js Quickstart
Google公式のクイックスタートをしといてください。スプレッドシートとの連携はこれでいけます。

index.js
credentials.json
token.json

ファイルはこの3つです。クイックスタートをすれば3つのファイルができてスプレッドシート情報を取得できます。では文字を書き込みたいと思います。

文字書き込み処理

node.jsで文字の書き込みをするのに今回はappendAPIを使います。詳しくは公式を見てください。
Method: spreadsheets.values.append

文字を書き込むだけなら簡単です。サンプルコードのlistMajors関数の場所に

index.js
const sheets = google.sheets({
    version: 'v4',
    auth
  });
  sheets.spreadsheets.values.append({
    spreadsheetId: 'スプレッドシートID',
    range: 'シート名',
    valueInputOption: 'RAW',
    insertDataOption: 'INSERT_ROWS',
    resource: {
      values: [
        ["hello", "world"]
      ],
    },
  },(err, result) => {
        if (err) return console.log(err);
        console.log('%d cells updated.', result.totalUpdatedCells);
      });

このコードを書けば出来ます。他のapiも公式のlistMajors関数と同じように書けばいけると思います。

スクリーンショット 2019-02-12 23.02.28.png

1行ずつ書き込まれるはずです。文字の書き込みだけならこれでできます。

公式コードをわかりやすく

ここからは記事内容とは一切関係ない内容です。自分のメモ用に書いときます。クイックスタートのサンプルコードがとてもわかりづらくて、読みづらかったのでPromise構文を使って、なるべくわかりやすくしました。Promise構文はあまり勉強していなかったので今回で相当勉強になりました。ついでにアロー関数式も。初心者なので少し不安ですが多分あっています。間違っていたら報告してもらえると嬉しいです。実行自体はできます。

index.js
const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];

const TOKEN_PATH = 'token.json';

Promise.resolve().then(() => {
  return new Promise((resolve, reject) => {
    fs.readFile('credentials.json', (err, content) => {
      if (err) return console.log('Error loading client secret file:', err);
      resolve(JSON.parse(content));
    });
  });
}).then((credentials) => {
  return new Promise((resolve, reject) => {
    const {
      client_secret,
      client_id,
      redirect_uris
    } = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(
      client_id, client_secret, redirect_uris[0]);

    fs.readFile(TOKEN_PATH, (err, token) => {
      if (err) return getNewToken(oAuth2Client, callback);
      oAuth2Client.setCredentials(JSON.parse(token));
      resolve(oAuth2Client);
    });
  });
}).then((auth) => {
  return new Promise((resolve, reject) => {
    const sheets = google.sheets({
      version: 'v4',
      auth
    });
    sheets.spreadsheets.values.append({
      spreadsheetId: 'スプレッドシートID',
      range: 'シート名',
      valueInputOption: 'RAW',
      insertDataOption: 'INSERT_ROWS',
      resource: {
        values: [
          ["Some value", "Another value"]
        ],
      },
    },(err, result) => {
          if (err) return console.log(err);
          console.log('%d cells updated.', result.totalUpdatedCells);
          resolve(result);
        });
  });
});

最後に

今回は結構エラーが出て、簡単だと思った内容だったけど相当勉強になりました。今度はGASやPHPとかでも同じ処理をしてみたいです。調べているとGASは当たり前として、PythonやPHPなどの記事も多かったのです。

参考サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away