tag:crieit.net,2005:https://crieit.net/tags/SpreadSheetAPI/feed
「SpreadSheetAPI」の記事 - Crieit
Crieitでタグ「SpreadSheetAPI」に投稿された最近の記事
2019-09-13T18:30:51+09:00
https://crieit.net/tags/SpreadSheetAPI/feed
tag:crieit.net,2005:PublicArticle/15394
2019-09-13T18:30:51+09:00
2019-09-13T18:30:51+09:00
https://crieit.net/posts/NOW-Google-API-GitHub
NOWでデプロイできるGoogleフォームみたいに追記できるAPIを作ったので、GitHubに公開してみた
<p><a target="_blank" rel="nofollow noopener" href="https://developers.google.com/sheets/api/">Spread Sheet API</a>を見てたら、Googleフォームみたいに空いている行に追記できるらしい...<br />
便利そうなので、汎用的に使えるようにNOW APIとしてデプロイできるようにしてみた&GitHubにも公開してみた。</p>
<h3 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h3>
<p>GitHub: <a target="_blank" rel="nofollow noopener" href="https://github.com/memory-lovers/append-row-api_zeit-now">Append Row API using ZEINT NOW and Spread Sheet API</a></p>
<p>こんな感じで、API叩くとスプレッドシートに追記できる。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/b3e01a00-c186-30fa-92ca-a2450240c40f.gif" width="600" /></p>
<h3 id="使い方: デプロイする"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9%3A+%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">使い方: デプロイする</a></h3>
<h4 id="1. git clone"><a href="#1.+git+clone">1. git clone</a></h4>
<p>まずはgit clone</p>
<pre><code class="console">$ git clone https://github.com/memory-lovers/append-row-api_zeit-now.git
</code></pre>
<h4 id="2. サービスアカウントのキーファイルの配置"><a href="#2.+%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E9%85%8D%E7%BD%AE">2. サービスアカウントのキーファイルの配置</a></h4>
<p><code>credential.json</code>というファイル名で、認証情報のキーファイルを配置</p>
<h4 id="3. 追記したいスプレッドシートの権限設定"><a href="#3.+%E8%BF%BD%E8%A8%98%E3%81%97%E3%81%9F%E3%81%84%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9A">3. 追記したいスプレッドシートの権限設定</a></h4>
<p>そのままだとサービスアカウントに書き込み権限がないためエラーに...<br />
そのため、追記したいスプレッドシートの共有権限にサービスアカウントを追加が必要。</p>
<p>サービスアカウントの作成やスプレッドシートの共有設定は、<br />
以下の記事がわかりやすかった...(<em>´ω`</em>)<br />
「<a target="_blank" rel="nofollow noopener" href="https://techblog.lclco.com/entry/2018/11/30/120000">Node.jsでGoogleスプレッドシートを操作する - LCL Engineers' Blog</a>」</p>
<h4 id="3. ローカルで試す"><a href="#3.+%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E8%A9%A6%E3%81%99">3. ローカルで試す</a></h4>
<p><code>now dev</code>コマンドでローカルで動かすことができます。<br />
実行すると<code>http://localhost:5001</code>で起動します。</p>
<pre><code class="console">$ now dev -p 5001
// or
$ npm run dev
</code></pre>
<h5 id="nowコマンドやアカウントがない場合..."><a href="#now%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%84%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%8C%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88...">nowコマンドやアカウントがない場合...</a></h5>
<p><a target="_blank" rel="nofollow noopener" href="https://zeit.co">こちらのZEITのページ</a>からログイン&アカウント作成!</p>
<p><a target="_blank" rel="nofollow noopener" href="https://zeit.co/docs/">公式ドキュメント</a>にあるように、インストールとログイン!</p>
<pre><code class="console"># nowコマンドのインストール
$ npm i -g now
# CLIでのログイン
$ now login
</code></pre>
<h4 id="3. ZEIT now にデプロイ"><a href="#3.+ZEIT+now+%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">3. ZEIT now にデプロイ</a></h4>
<p><code>now</code>コマンドでデプロイできます。<br />
プロジェクト名は、<code>now.json</code>の<code>name</code>に書いてある<strong>append-api</strong>になります。</p>
<pre><code class="console">$ now
// or
$ npm run deploy
</code></pre>
<h3 id="使い方: API の呼び出し"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9%3A+API+%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97">使い方: API の呼び出し</a></h3>
<p>デプロイした API は、以下のパラメタを受け取ります</p>
<ol>
<li>追記するシートの ID: <code>spreadsheetId</code></li>
<li>追記する内容の配列: <code>values</code></li>
</ol>
<p>curl で呼び出すサンプルは以下のとおりです。<br />
URL には、<code>https://append-api.memory-lovers.now.sh</code><br />
のようなデプロイした URL を設定。</p>
<p>ローカルで起動した場合は、<code>https://localhost:5001</code>を設定。</p>
<pre><code class="bash">#!/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"
</code></pre>
<hr />
<h3 id="コードはこんな感じ。"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98%E3%80%82">コードはこんな感じ。</a></h3>
<p>主にExpressに関する処理が多いですが、Google APIsを使うのは、<br />
<code>const doAppend = async (spreadsheetId, values) => {</code>のあたりに集約。</p>
<pre><code class="javascript">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;
</code></pre>
<h5>はまったところ...<code>credential.json</code>を認識しない...</h5>
<p>now.jsonに環境変数<code>GOOGLE_APPLICATION_CREDENTIALS</code>を設定して、<br />
読み込むファイルを指定していたけど、エラーが...</p>
<pre><code class="json">"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "./credential.json"
}
</code></pre>
<blockquote>
<p>Error in append: Error: The file at ./credential.json does not exist, or it is not a file.</p>
</blockquote>
<p>デプロイされたフォルダを見てみると、<code>credential.json</code>が配置されていない...</p>
<p>いろいろ調べてみたところ、ビルドをするので関連のないファイルは配置されないっぽい...<br />
なので、<code>index.js</code>の冒頭に以下を追加して、読み込むように変更してみたところ、<br />
うまく認識されるようになったヽ(=´▽`=)ノ</p>
<pre><code class="javascript">require("./credential.json"); // サービスアカウントの認証情報
</code></pre>
<h3 id="活用事例1: 問い合わせ管理"><a href="#%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B1%3A+%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E7%AE%A1%E7%90%86">活用事例1: 問い合わせ管理</a></h3>
<p>開発しているWebサービスの問い合わせ効率化のために利用(<em>´ω`</em>)</p>
<p>Nuxtに用意したフォームで受けた内容をスプレッドシートに転記して管理できるように♪</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">書籍のリクエスト、できてきた(*´ω`*)ピタゴラスイッチ的にFirestoreトリガーで、Slackに通知とSpread Sheetに追記ヽ(=´▽`=)ノ<br><br>これで、だいぶ楽になるはず(*´ω`*)♪ <a target="_blank" rel="nofollow noopener" href="https://t.co/9SIY2T23u3">pic.twitter.com/9SIY2T23u3</a></p>— 積読ハウマッチ📚きらぷか (@kira_puka) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka/status/1172029880680079360?ref_src=twsrc%5Etfw">September 12, 2019</a></blockquote>
<p>以前、<a target="_blank" rel="nofollow noopener" href="https://qiita.com/kira_puka/items/d372cf8ce1c5c98360bd">書いた記事</a>のSlackAPIも使い、<br />
通知と管理を一度にできるようになりましたヽ(=´▽`=)ノ</p>
<h3 id="活用事例2: 統計情報の収集"><a href="#%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B2%3A+%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%8E%E9%9B%86">活用事例2: 統計情報の収集</a></h3>
<p>定期的にユーザ数やデータ数などを集計してスプレッドシートに追記できるように!<br />
スプレッドシートに追記するとグラフを出せるようになるのですてき(<em>´ω`</em>)</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SpreadSheetAPIとなかよくなれたのでとりあえず、取ってる統計データを入れてみた(*´ω`*)ここ1週間で、1,300万円分が積まれ、総額2,000万円近く、登録されてた( ゚д゚)!強者達が...集まってきている...((((;゚Д゚))))ガクガクブルブル<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/%E7%A9%8D%E8%AA%AD%E3%83%8F%E3%82%A6%E3%83%9E%E3%83%83%E3%83%81?src=hash&ref_src=twsrc%5Etfw">#積読ハウマッチ</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/esCqTrQmLK">pic.twitter.com/esCqTrQmLK</a></p>— 積読ハウマッチ📚きらぷか (@kira_puka) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka/status/1171674794653188096?ref_src=twsrc%5Etfw">September 11, 2019</a></blockquote>
<p>個人開発なので常に稼働が足りないですが、<br />
こういった裏方作業的なのも、もっと効率化していけるようになりたい...!!</p>
<p>以上!!</p>
<h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%EF%BC%81%EF%BC%81">こんなのつくってます!!</a></h2>
<p>最近、積読用の読書管理アプリ「積読ハウマッチ」をリリースしました!<br />
<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p>
<p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p>
<p>要望・感想・アドバイスなどあれば、<br />
公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで</p>
<h1 id="参考にしたサイト様"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E6%A7%98">参考にしたサイト様</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/castaneai/items/a53d0b89bca5b84654be">スプレッドシート API で行を追加する - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/howdy39/items/ca719537bba676dce1cf">Googleスプレッドシートをプログラムから操作 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/suisuina/items/a41932088acacea4835e">Google spreadsheetの値を取得する - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/docs/authentication/api-keys?rd=1&visit_id=637037608757242156-1685701782">API キーの使用 | 認証 | Google Cloud</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/googleapis/google-api-nodejs-client#using-api-keys">googleapis/google-api-nodejs-client: Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/server-side/node-js-server-side/using-google-apis-node-js-client/">Google APIs Node.js Client を使って Google Analytics のページビューを取得する | DevelopersIO</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/zeit/now/issues/749">Storing complex secrets · Issue #749 · zeit/now</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://spectrum.chat/zeit/now/storing-authentication-credentials-file~aee6b468-9ea0-4f2d-9b7a-f07831df2fd9">Storing authentication credentials file · ZEIT</a></li>
<li><a href="https://crieit.net/posts/Zeit-Now">ZeitのNowにデプロイするファイルを指定する時の注意 - Crieit</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://blog.hokuma.net/serverless/deploy_to_now/">Nowを使って静的サイトとAPIを単一レポジトリで運用する</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/miminashi/items/f48cd4c25b06fcab5ea3">curlチートシート - Qiita</a></li>
</ul>
きらぷか@積読ハウマッチ/SSSAPIなど