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など