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

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

#API取得
[Node.js Quickstart](https://developers.google.com/sheets/api/quickstart/nodejs)
Google公式のクイックスタートをしといてください。スプレッドシートとの連携はこれでいけます。

```
index.js
credentials.json
token.json
```

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

#文字書き込み処理
node.jsで文字の書き込みをするのに今回は`append`APIを使います。詳しくは公式を見てください。
[Method: spreadsheets.values.append](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append?hl=ja#InsertDataOption)

文字を書き込むだけなら簡単です。サンプルコードの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関数と同じように書けばいけると思います。

<img width="252" alt="スクリーンショット 2019-02-12 23.02.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/346938/44ae7ba3-17f7-1c4f-f37c-d5eacb7f4391.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などの記事も多かったのです。


#参考サイト
* [Node.js Quickstart](https://developers.google.com/sheets/api/quickstart/nodejs)
* [github:Google Spreadsheet.js](https://gist.github.com/iaincollins/43302ea047d4a77e6605350598d160c1)
* [github:node-samples](https://github.com/gsuitedevs/node-samples/blob/master/sheets/snippets/snippets.js)