Spread Sheet APIを見てたら、Googleフォームみたいに空いている行に追記できるらしい...
便利そうなので、汎用的に使えるようにNOW APIとしてデプロイできるようにしてみた&GitHubにも公開してみた。
GitHub: Append Row API using ZEINT NOW and Spread Sheet API
こんな感じで、API叩くとスプレッドシートに追記できる。
まずはgit clone
$ git clone https://github.com/memory-lovers/append-row-api_zeit-now.git
credential.json
というファイル名で、認証情報のキーファイルを配置
そのままだとサービスアカウントに書き込み権限がないためエラーに...
そのため、追記したいスプレッドシートの共有権限にサービスアカウントを追加が必要。
サービスアカウントの作成やスプレッドシートの共有設定は、
以下の記事がわかりやすかった...(´ω`)
「Node.jsでGoogleスプレッドシートを操作する - LCL Engineers' Blog」
now dev
コマンドでローカルで動かすことができます。
実行するとhttp://localhost:5001
で起動します。
$ now dev -p 5001
// or
$ npm run dev
こちらのZEITのページからログイン&アカウント作成!
公式ドキュメントにあるように、インストールとログイン!
# nowコマンドのインストール
$ npm i -g now
# CLIでのログイン
$ now login
now
コマンドでデプロイできます。
プロジェクト名は、now.json
のname
に書いてあるappend-apiになります。
$ now
// or
$ npm run deploy
デプロイした API は、以下のパラメタを受け取ります
spreadsheetId
values
curl で呼び出すサンプルは以下のとおりです。
URL には、https://append-api.memory-lovers.now.sh
のようなデプロイした URL を設定。
ローカルで起動した場合は、https://localhost:5001
を設定。
#!/bin/bash
SHEET_ID='YOUR_SHEET_ID'
URL='API_URL'
curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data '{ "spreadsheetId": "'$SHEET_ID'", "values": [ ["A", "B", "C"], ["D", "E", "F"] ] }' \
"$URL/append"
主にExpressに関する処理が多いですが、Google APIsを使うのは、
const doAppend = async (spreadsheetId, values) => {
のあたりに集約。
import bodyParser from "body-parser";
import Express from "express";
import { google } from "googleapis";
require("./credential.json"); // サービスアカウントの認証情報
const app = Express();
// POSTのBODYにJSONを使うため、body-parserを有効化
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
/**
* Spread Sheetに行を追加する処理
* @param {String} spreadsheetId シートID
* @param {String[][]} values 追記するデータ。2次元配列で指定
*/
const doAppend = async (spreadsheetId, values) => {
// パラメタのチェック
if (!spreadsheetId || !values) throw new Error("Error: Invalid Params");
// Spread Sheet APIを使うための認証処理
const auth = await google.auth.getClient({
scopes: ["https://www.googleapis.com/auth/spreadsheets"]
});
const sheets = google.sheets({ version: "v4", auth });
// APIを呼び出して、行の追加処理
const req = {
// シートのID
spreadsheetId: spreadsheetId,
// A1に追記することを指定
range: "A1",
// 追記する形式を指定。
valueInputOption: "USER_ENTERED",
// A1に値があったら下方向に空欄を探しにいく
insertDataOption: "INSERT_ROWS",
// 追加する行のデータ。2次元配列で指定
resource: {
values: values
}
};
await sheets.spreadsheets.values.append(req);
};
// '/append'にアクセスしたら、doAppend関数を呼ぶようにマッピング
app.post("/append", async (req, res) => {
try {
// パラメタのチェック
if (!req.body) throw new Error("Error: Empty Body");
// パラメタの取得
const spreadsheetId = req.body.spreadsheetId || "";
const values = req.body.values || "";
// 追記処理の呼び出し
await doAppend(spreadsheetId, values);
res.end();
} catch (error) {
console.error(`Error in append: ${error}`, error);
res.status(500).send({ error: `${error}` });
}
});
export default app;
credential.json
を認識しない...now.jsonに環境変数GOOGLE_APPLICATION_CREDENTIALS
を設定して、
読み込むファイルを指定していたけど、エラーが...
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "./credential.json"
}
Error in append: Error: The file at ./credential.json does not exist, or it is not a file.
デプロイされたフォルダを見てみると、credential.json
が配置されていない...
いろいろ調べてみたところ、ビルドをするので関連のないファイルは配置されないっぽい...
なので、index.js
の冒頭に以下を追加して、読み込むように変更してみたところ、
うまく認識されるようになったヽ(=´▽`=)ノ
require("./credential.json"); // サービスアカウントの認証情報
開発しているWebサービスの問い合わせ効率化のために利用(´ω`)
Nuxtに用意したフォームで受けた内容をスプレッドシートに転記して管理できるように♪
書籍のリクエスト、できてきた(*´ω`*)ピタゴラスイッチ的にFirestoreトリガーで、Slackに通知とSpread Sheetに追記ヽ(=´▽`=)ノ
— 積読ハウマッチ📚きらぷか (@kira_puka) September 12, 2019
これで、だいぶ楽になるはず(*´ω`*)♪ pic.twitter.com/9SIY2T23u3
以前、書いた記事のSlackAPIも使い、
通知と管理を一度にできるようになりましたヽ(=´▽`=)ノ
定期的にユーザ数やデータ数などを集計してスプレッドシートに追記できるように!
スプレッドシートに追記するとグラフを出せるようになるのですてき(´ω`)
SpreadSheetAPIとなかよくなれたのでとりあえず、取ってる統計データを入れてみた(*´ω`*)ここ1週間で、1,300万円分が積まれ、総額2,000万円近く、登録されてた( ゚д゚)!強者達が...集まってきている...((((;゚Д゚))))ガクガクブルブル#積読ハウマッチ pic.twitter.com/esCqTrQmLK
— 積読ハウマッチ📚きらぷか (@kira_puka) September 11, 2019
個人開発なので常に稼働が足りないですが、
こういった裏方作業的なのも、もっと効率化していけるようになりたい...!!
以上!!
最近、積読用の読書管理アプリ「積読ハウマッチ」をリリースしました!
積読ハウマッチは、Nuxt.js+Firebaseで開発してます!
もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ
要望・感想・アドバイスなどあれば、
公式アカウント(@MemoryLoverz)や開発者(@kira_puka)まで
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント