tag:crieit.net,2005:https://crieit.net/users/Neri78/feed Neri78の投稿 - Crieit CrieitでユーザーNeri78による最近の投稿 2021-07-07T10:35:50+09:00 https://crieit.net/users/Neri78/feed tag:crieit.net,2005:PublicArticle/17489 2021-07-07T10:35:50+09:00 2021-07-07T10:35:50+09:00 https://crieit.net/posts/twilioquest-operator-campaign-jp TwilioQuestオペレーター養成キャンペーン開催 <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/iSYGJh_yu0kts-Smzz0IRscHiRDFXuZ_b2EwbyA5eOc89z.width-808.png" alt="TQ JP contest" /></p> <p>Twilio Developer Evangelistの<a target="_blank" rel="nofollow noopener" href="https://www.twitter.com/neri78">池原</a>です。昨日、<a target="_blank" rel="nofollow noopener" href="https://dev.to/twilio/twilioquest-3-13od">TwilioQuest 3 日本語プレビュー版のリリース</a>をアナウンスしましたが、このリリースを記念し、 <strong>「TwilioQuestオペレーター養成キャンペーン」</strong> を実施します!</p> <p>このキャンペーンではTwilioQuest 3日本語プレビュー版をインストールし、特定のミッションをクリアしたプレイヤーを対象として毎週2名の方に<a target="_blank" rel="nofollow noopener" href="https://www.apple.com/jp/airpods-pro/">Apple AirPods Pro</a>を進呈します。また、最終週には「TwilioQuestグランドチャンピオンシップ 2021 Summer」を開催します。この、「TwilioQuestグランドチャンピオンシップ 2021 Summer」では制限時間内に獲得した経験値を競うハイスコアチャレンジを実施し、優勝者には<a target="_blank" rel="nofollow noopener" href="https://www.apple.com/jp/macbook-pro-13/">Apple M1 Macbook Pro(13インチ)</a>を進呈します!</p> <h2 id="イベントスケジュールおよび賞品について"><a href="#%E3%82%A4%E3%83%98%E3%82%99%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B7%E3%82%99%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%8A%E3%82%88%E3%81%B2%E3%82%99%E8%B3%9E%E5%93%81%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">イベントスケジュールおよび賞品について</a></h2> <p>各ラウンドのスケジュール、ならびに賞品については下記の通りとなります。</p> <div class="table-responsive"><table> <thead> <tr> <th>日程 (日本時間)</th> <th>賞品</th> </tr> </thead> <tbody> <tr> <td>ラウンド1: 2021年07月12日(月) - 2021年07月18日(日)抽選日: 2021年07月19日(月)12:00</td> <td>AirPods Pro x 2名様</td> </tr> <tr> <td>ラウンド2: 2021年07月19日(月) - 2021年07月25日(日)抽選日: 2021年07月26日(月)12:00</td> <td>AirPods Pro x 2名様</td> </tr> <tr> <td>ラウンド3: 2021年07月26日(月) - 2021年08月01日(日)抽選日: 2021年08月02日(月)12:00</td> <td>AirPods Pro x 2名様</td> </tr> <tr> <td>TwilioQuestグランドチャンピオンシップ 2021 Summer開催日: 2021年08月06日(金)15:00 - 18:00</td> <td>M1 macbook pro x 1名様</td> </tr> </tbody> </table></div> <h2 id="キャンペーン・イベントへの参加方法"><a href="#%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%98%E3%82%9A%E3%83%BC%E3%83%B3%E3%83%BB%E3%82%A4%E3%83%98%E3%82%99%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95">キャンペーン・イベントへの参加方法</a></h2> <p>次の手順に従い、キャンペーンにご参加ください。</p> <ol> <li>下記ページからキャンペーン・イベントに登録<br /> <a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/go/twilioquest-grand-championship-2021-summer-japan-1">TwilioQuestオペレーター養成キャンペーン参加申し込みページ</a></li> <li>TwilioQuest日本語プレビュー版をダウンロードし、インストール<br /> <a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/quest/ja">TwilioQuest日本語版ページ</a></li> <li>TwilioQuestを起動し、登録後にメールアドレスあてに送られるラウンド1-3共通の <strong>「Operation」コード</strong> を手順に沿って適用 <ol> <li>TwilioQuestを起動し、<code>3</code>キーで<code>Settings</code>画面を表示。その後、画面左のナビゲーションから<code>Operations</code>を選択</li> <li><code>Join Code</code>ラベル下のテキストフィールドに<code>Operation</code>コードを入力し、<code>Join</code> ボタンをクリック。 <img src="https://twilio-cms-prod.s3.amazonaws.com/images/Tpp7JSUXioZVI5a0giO0g3JaOjxK6R-_w9wIsKbpG1E3PG.width-500.png" alt="TQ - apply the Operation Code" /></li> </ol></li> <li><strong><code>Voice: マラカイト鉱山</code> ミッション</strong> を最後までクリア</li> </ol> <h2 id="応募にあたっての注意点"><a href="#%E5%BF%9C%E5%8B%9F%E3%81%AB%E3%81%82%E3%81%9F%E3%81%A3%E3%81%A6%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9">応募にあたっての注意点</a></h2> <ul> <li><p>Email欄には必ず <strong>TwilioQuestで使用するTwilioアカウントのメールアドレス</strong> を入力してください。情報が異なっている場合、キャンペーン条件の達成を確認できないため、抽選の対象外となります。</p></li> <li><p>キャンペーンは<strong>日本時間2021年7月12日(月) 00:00:00 から2021年8月1日(日) 23:59:59まで</strong>の期間となります。この期間外にクリアした場合は <strong>抽選の対象外</strong> となります。</p></li> <li><p>「TwilioQuestグランドチャンピオンシップ 2021 Summer」は2021年8月6日(金)15:00 - 18:00に実施される <strong>限定</strong> イベントです。登録後にお送りさせていただくURLに当日参加し、オープニングでアナウンスされる <strong>グランドチャンピオンシップ専用の「Operationコード」を別途利用いただくことになります。</strong></p></li> </ul> <p>その他の留意点やよくある質問については<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/go/twilioquest-grand-championship-2021-summer-japan-1">イベントページ</a>をご確認ください。</p> <h2 id="キャンペーンやTwilioQuestについての質問"><a href="#%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%98%E3%82%9A%E3%83%BC%E3%83%B3%E3%82%84TwilioQuest%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E8%B3%AA%E5%95%8F">キャンペーンやTwilioQuestについての質問</a></h2> <p>キャンペーンやTwilioQuestについて質問がある場合はぜひ、こちらのTwitchチャンネルに登録ください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.twitch.tv/neri78">Twitch - Neri78</a></p> <p>このチャンネルでは下記の日程でTwilioQuest Q&Aストリーミングを開催します。</p> <ul> <li>期間: 7月12日(月) - 8月2日(月)</li> <li>月曜日(抽選結果発表含む)12:00 - 13:00</li> <li>水曜日 12:00 - 13:00</li> </ul> <p>あるいは<a target="_blank" rel="nofollow noopener" href="https://twil.io/tq-discord">TwilioQuest Discordサーバー</a>でも質問いただけます。</p> <p>さあ、TwilioQuestプログラムのオペレーターとなってクラウドの平和を守りましょう!</p> <p><strong>Let’s Hack!</strong></p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/CaeWpniOcDnda34Fs6sWG0gp6cEjEaNcu8ymxa64Hy6FDj.width-500.png" alt="TwilioQuest - Cedric" /></p> Neri78 tag:crieit.net,2005:PublicArticle/17488 2021-07-06T16:22:21+09:00 2021-07-06T16:22:21+09:00 https://crieit.net/posts/TwilioQuest-3 TwilioQuest 3 日本語プレビュー版リリース! <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/TwilioQuest-JP-WebSite.width-1616.png" alt="TQ3 JP" /></p> <p>Twilio Developer Evangelistの<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/author/dikehara">池原</a>です。ゲームを遊びながらTwilio製品の利用方法に加えGitHubやPythonを学習できるTwilioQuest 3の日本語プレビュー版をリリースしました。</p> <h2 id="TwilioQuestとは?"><a href="#TwilioQuest%E3%81%A8%E3%81%AF%3F">TwilioQuestとは?</a></h2> <p>TwilioQuestはゲームをプレイするようにさまざまな開発スキルを向上できるチュートリアルです。2019年に最新バージョンである「TwilioQuest 3」がリリースされました。Twilio製品の利用方法だけでなく、Pythonのようなプログラミング言語や、GitHubの使い方などを学習できます。</p> <p>より詳しい説明やミッションの進め方については以前こちらの記事で取り上げていますので、こちらもぜひご覧ください。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/game-tutorial-twilioquest">Game + Tutorial = TwilioQuest3のはじめかた</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/twilioquest-3-basic-training-hack-security">TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/twilioquest-3-basic-training-part2-set-up-your-twilio-account">TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/twilioquest-3-basic-training-part3-get-a-free-credit">TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット</a></li> </ul> <p>全編英語で作成されていますが、ゲーム好きな開発者には非常に人気のコンテンツです。日本でも多くのみなさんにプレイいただいていますが、「日本語版が欲しい」という要望を多くいただいたため今回、日本語版を開発しました。</p> <h2 id="日本語プレビュー版について"><a href="#%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%9A%E3%83%AC%E3%83%92%E3%82%99%E3%83%A5%E3%83%BC%E7%89%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">日本語プレビュー版について</a></h2> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/tkpUrdSf2WZc10W11P23Lag1kMgGyd7M7kuQ5R4mD52sd.width-1600.png" alt="TQJP - Start" /></p> <p>今回のリリースでは下記4つのミッションコンテンツと一部のUIを日本語化しています。</p> <ul> <li><code>基本トレーニング</code> - TwilioQuestのプレイ方法、ならびにTwilio製品の基本を学べるミッション</li> <li><code>Voice: マラカイト鉱山</code> - Twilio Programmable Voice入門ミッション</li> <li><code>Pythonic Templeの謎</code> - Python入門ミッション</li> <li><code>オープンソースの炎</code> - Git、GitHub入門ミッション</li> </ul> <p>基本的なプレイ方法については英語版と同じですが、ミッション内容については単純な翻訳だけではなく日本の皆さんに向けて加筆・修正を加えています。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/Us7eG1miwxjs8oxB5YFLl809wBFkZtJu5tPw-Jj8tEMq0.width-1600.png" alt="TQJP - fog owl" /></p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/trBmHPHVFoj3hyYZu1LTyLonyGUMW8x-q588nuVFse6J8.width-1600.png" alt="TQJP - voice" /></p> <h2 id="ダウンロードおよびインストール方法"><a href="#%E3%82%BF%E3%82%99%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%88%E3%82%99%E3%81%8A%E3%82%88%E3%81%B2%E3%82%99%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95">ダウンロードおよびインストール方法</a></h2> <p>TwilioQuestは下記よりダウンロードいただけます。英語版をすでにお持ちの方は改めてダウンロードいただく必要はありません。過去にプレイされた記録はそのまま保持されます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/quest/ja/download">TwilioQuest - ダウンロード</a></p> <p>日本語プレビュー版の起動方法については<a target="_blank" rel="nofollow noopener" href="https://youtu.be/N9ySG7QiM-g">こちら</a>をご覧ください。</p> <h2 id="Let’s Hack!"><a href="#Let%E2%80%99s+Hack%21">Let’s Hack!</a></h2> <p>ぜひ、日本語版をプレイしてみてください!今後も日本語ミッションの追加、アップデートを予定しています。</p> <p>日本語版の不具合や質問については下記までお問い合わせください。</p> <ul> <li>Twitter: <a target="_blank" rel="nofollow noopener" href="https://www.twitter.com/neri78">@neri78</a></li> <li>Email: dikehara [@] twilio.com</li> </ul> Neri78 tag:crieit.net,2005:PublicArticle/16033 2020-08-18T11:11:49+09:00 2020-08-18T11:11:49+09:00 https://crieit.net/posts/twilioquest-summer-challenge-japan TwilioQuest 24時間チャレンジ開催のおしらせ <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/OxWupEpU2L14_9o30dTrGd57N1FlwcCrIbCarsCdpVPFR.width-1616.jpg" alt="Alt Text" /></p> <p>こんにちは!猛暑が続いていますが、お元気でしょうか?私は夏の暑さとCOVID-19感染者数の増加により、すっかり引きこもっている毎日です。</p> <p>さて、先日7月4日にTwilioJP-UG岡山さん主催によるTwilioQuest Nightがオンラインで開催されました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://takeshi.furusato.blog/2020/07/10/twiliojp-ug4.html">takeshi.furusato.blog - TwilioJP-UG Okayama #4 TwilioQuest Night を開催しました。</a></p> <p>今回はこのイベントをもとにTwilio Japanとして2020年8月28日(金)〜 29日(土)にかけて獲得経験値を競う「TwilioQuest 24時間チャレンジ」を開催します。</p> <h2 id="TwilioQuestとは"><a href="#TwilioQuest%E3%81%A8%E3%81%AF">TwilioQuestとは</a></h2> <p>TwilioQuestは、Twilioが提供する製品の利用方法やJavaScript、PHP、Python、GitHubについてゲームをプレイするように学べるチュートリアルです。最新バージョンではMac/Windows/Linuxそれぞれにインストールでき、自分自身のペースでミッションに挑戦できます。</p> <p>参考記事 - <a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/game-tutorial-twilioquest">Game + Tutorial = TwilioQuest3のはじめかた</a></p> <h2 id="24時間チャレンジについて"><a href="#24%E6%99%82%E9%96%93%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">24時間チャレンジについて</a></h2> <p>今回のTwilioQuest 24時間チャレンジは制限時間内にどれだけ経験値を獲得できるかを競うイベントとなります。ご自身が興味のあるミッションを好きな時間にプレイできるため、これまで使ったことのないプロダクトや言語などに挑戦することができます。</p> <p>参加者および高得点者には豪華賞品をご用意しています!例えば...</p> <ul> <li>TwilioQuest Tシャツ(参加者全員に進呈)<br /> <img src="https://twilio-cms-prod.s3.amazonaws.com/images/MS0nFh6SlYK6KyCZzfx0PVnD-B485HWracoqKIg64krrFc.width-500.png" alt="TQ - T-shirts" /></li> <li>TwilioQuest DevBox(上位2名に進呈)<br /> <img src="https://twilio-cms-prod.s3.amazonaws.com/images/lGZdoKOFkMp9V9kqIYhhz8XDHDPoliF6ErCCltKz7JaX0K.width-500.png" alt="TQ - DevBox" /></li> <li>さらに豪華賞品を追加予定(後日アナウンス)</li> </ul> <h2 id="参加条件"><a href="#%E5%8F%82%E5%8A%A0%E6%9D%A1%E4%BB%B6">参加条件</a></h2> <p>こちらは至ってシンプルです。<a target="_blank" rel="nofollow noopener" href="https://connpass.com/event/185412">イベントに登録いただく</a>こと、<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/quest">TwilioQuest 3</a>をダウンロードし、インストール、プレイできる環境をご用意いただくことと、賞品を受け取る場合は<a target="_blank" rel="nofollow noopener" href="https://twilioquest242020.splashthat.com/">弊社の登録フォーム</a>にも別途登録いただくことが条件となります。</p> <h2 id="イベント期間中のサポートについて"><a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E6%9C%9F%E9%96%93%E4%B8%AD%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">イベント期間中のサポートについて</a></h2> <p>イベント期間中は、次の予定(日本標準時)でTechnical Assistantによるサポートを提供します。Twilio社員やTwilio ChampionsがTwilioQuestのプレイ方法やミッションについての質問などを日本語でお答えします。</p> <ul> <li>2020/08/28 16:30 - 18:00<br /> Ask the TA (オープニングイベント内)</li> <li>2020/08/28 18:00 - 20:00<br /> Slackチャンネル内での非同期Q&A</li> <li>2020/08/28 20:00 - 22:00<br /> <a target="_blank" rel="nofollow noopener" href="https://www.twitch.tv/neri78">Twitch配信</a>: 途中経過発表ならびにリアルタイムQ&A</li> <li>2020/08/28 22:00 - 08/29 05:00<br /> Slackチャンネル内での非同期Q&A</li> <li>2020/08/29 05:00 - 07:00<br /> <a target="_blank" rel="nofollow noopener" href="https://www.twitch.tv/neri78">Twitch配信</a>: 途中経過発表ならびにリアルタイムQ&A</li> <li>2020/08/29 07:00 - 12:00<br /> Slackチャンネル内での非同期Q&A</li> <li>2020/08/29 12:00 - 14:00<br /> <a target="_blank" rel="nofollow noopener" href="https://www.twitch.tv/neri78">Twitch配信</a>: 途中経過発表ならびにリアルタイムQ&A</li> <li>2020/08/29 14:00 - 17:00<br /> Slackチャンネル内での非同期Q&A</li> </ul> <p>*ストリーミングについては予定が変更になる可能性があります。</p> <h2 id="参加方法"><a href="#%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95">参加方法</a></h2> <p>下記イベントページよりご登録ください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://connpass.com/event/185412">TwilioQuest 24時間チャレンジイベントページ</a></p> <h2 id="この記事についての問い合わせ"><a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B">この記事についての問い合わせ</a></h2> <p>イベントについての質問がありましたらぜひお問い合わせください。みなさんの参加をお待ちしています!</p> <ul> <li>Twitter (<a target="_blank" rel="nofollow noopener" href="https://twitter.com/neri78">@Neri78</a>)</li> <li>Email: <a target="_blank" rel="nofollow noopener" href="mailto:dikehara@twilio.com">[email protected]</a></li> <li>Github: <a target="_blank" rel="nofollow noopener" href="https://github.com/neri78">https://github.com/neri78</a></li> <li>Twitch: <a target="_blank" rel="nofollow noopener" href="https://twitch.tv/neri78">https://twitch.tv/neri78</a></li> </ul> Neri78 tag:crieit.net,2005:PublicArticle/15913 2020-05-27T15:21:26+09:00 2020-05-27T15:21:26+09:00 https://crieit.net/posts/google-twilio-studio-rest-api-node-jp Googleスプレッドシートのシフト表を使ってTwilio Studioフローの転送先をNode.jsから更新する方法 <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/bequajswJOH0AUI_wEGCzYL1tE1Lk7xoDRK3nmBGdPsuLw.width-808.png" alt="Header" /><br /> <a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/call-forwarding-studio-remote-work">以前の記事</a>で、在宅勤務に伴う電話問い合わせの一時休止を解決する方法として、Twilio Studioを利用し個人電話に転送する方法を紹介しました。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/n6KNulbJGD3QxKIb-krEiNGnVjw963EqHHcaTmPpBLYAER.width-800.png" alt="Twilio Studio - Flow" /></p> <p>今回は<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/load-data-from-google-spreadsheet-jp">別の記事</a>で紹介したGoogleスプレッドシートのシフトデータをもとに転送先となる個人をNode.jsで変更する方法を紹介します。</p> <p>前提条件</p> <ul> <li>Twilioアカウントを持っていること(<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/how-to-create-twilio-account-jp">無料トライアルのサインアップ方法</a>)</li> <li>期間限定の問い合わせ番号となる<a target="_blank" rel="nofollow noopener" href="https://support.twilio.com/hc/en-us/articles/360044841214-Twilio-%E3%83%95%E3%83%AA%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6#h_167b5625-0036-44e6-936f-108ed091cb80">電話番号を購入</a>していること<br /> (<a target="_blank" rel="nofollow noopener" href="https://support.twilio.com/hc/en-us/articles/360044400214-%E8%A6%8F%E5%88%B6%E6%83%85%E5%A0%B1%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E6%9B%B8%E9%A1%9E%E3%81%AE%E6%8F%90%E5%87%BA%E6%96%B9%E6%B3%95">日本の番号を取得する場合</a>)</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/call-forwarding-studio-remote-work">こちらの記事</a>に則りフローを作成、公開済みであること</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/load-data-from-google-spreadsheet-jp">こちらの記事</a>に則りGoogleスプレッドシートからデータを取得するNode.jsアプリケーションを作成済みであること</li> </ul> <h2 id="Node.jsプロジェクトの作成とパッケージのインストール"><a href="#Node.js%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Node.jsプロジェクトの作成とパッケージのインストール</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/load-data-from-google-spreadsheet-jp">以前の記事</a>に沿って作成したNode.jsアプリケーションのフォルダーに移動し、<a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/twilio">twilio-node</a>パッケージをインストールします。</p> <pre><code>npm i twilio </code></pre> <p>次に.envファイルにTwilioへの接続情報やStudioフローのIDを保存する環境変数を追加します。</p> <pre><code>SPREADSHEET_ID= STAFF_WORKSHEET_ID= SHIFT_WORKSHEET_ID= TWILIO_ACCOUNT_SID= TWILIO_AUTH_TOKEN= TWILIO_STUDIO_FLOW_SID= </code></pre> <h2 id="Twilio Studio REST API v2を使ったフローの取得と更新"><a href="#Twilio+Studio+REST+API+v2%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%A8%E6%9B%B4%E6%96%B0">Twilio Studio REST API v2を使ったフローの取得と更新</a></h2> <p>今回利用するTwilio Studio REST API v2は4月末に<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/automate-flow-deployments-studio-rest-api-v2-beta">パブリックベータとしてアナウンス</a>されたばかりの機能です。この新しいAPIを使って定義済みのフロー設定を外部から更新できます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/console">Twilioコンソール</a>を開きACCOUNT SIDと、AUTH TOKENをそれぞれ.envファイルの <code>TWILIO_ACCOUNT_SID</code>ならびに <code>TWILIO_STUDIO_FLOW_SID</code> の値として設定します。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/cfc6YMp-DykS55Rahs24kn2759AIZSMNsfhTto3dnHBibZ.width-800.png" alt="AccountSid & AuthToken" /></p> <p>次に、<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/console/studio/dashboard">Studioコンソール</a>を開き、call forwardingフローのSIDを <code>TWILIO_STUDIO_FLOW_SID</code> の値として設定します。</p> <p>index.jsを開き、<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/load-data-from-google-spreadsheet-jp">前回の記事</a>でテストに使用したコードを変更します。このコードでは、シフト担当者の電話番号を取得した状態で、Twilio Nodeクライアントを利用しStudioフローを取得します。</p> <pre><code class="js">loadShiftPhoneNumbers().then ( numbers => { // twilio client const client = require('twilio') (process.env.TWILIO_ACCOUNTSID, process.env.TWILIO_AUTH_TOKEN); // Studioのフローを取得 client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID) .fetch() .then(flow => {}) .catch(error => console.error(error)) ;}) .catch( error => console.error(error)); </code></pre> <p>フローの定義情報は、definitionというプロパティに保持されているため、そちらを取得します。また、各ウィジェットについては、statesというプロパティに配列として定義されています。このstates配列からウィジェットの名前をキーとして着信を転送するウィジェットを取得し、更に転送先番号を更新します。</p> <pre><code class="js">loadShiftPhoneNumbers().then ( numbers => { // twilio client const client = require('twilio') (process.env.TWILIO_ACCOUNTSID, process.env.TWILIO_AUTH_TOKEN); // Studioのフローを取得 client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID) .fetch() .then(flow => { // フローの定義を取得 let definition = flow.definition; // forward_callウィジェットを取得 let callForwardWidget = definition.states.find( item => item.name == 'forward\_call'); // 転送先番号をシフトの電話番号で更新 callForwardWidget.properties.to = numbers; }) .catch(error => console.error(error)); }) .catch( error => console.error(error)); </code></pre> <p>後は更新した定義をStudio REST API v2を使い、反映させます。この際、statusプロパティで反映したフローを下書き状態(draft)にしておくことも、即座に公開(published)にすることもできます。</p> <pre><code class="js">loadShiftPhoneNumbers().then ( numbers => { // twilio client const client = require('twilio') (process.env.TWILIO_ACCOUNTSID, process.env.TWILIO_AUTH_TOKEN); // Studioのフローを取得 client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID) .fetch() .then(flow => { // フローの定義を取得 let definition = flow.definition; // forward_callウィジェットを取得 let callForwardWidget = definition.states.find( item => item.name == 'forward\_call'); // 転送先番号をシフトの電話番号で更新 callForwardWidget.properties.to = numbers; // 更新した定義を反映し、即座に公開 client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID) .update({ definition: definition, commitMessage: 'シフトの更新 - 2020/05/15', status: 'published'}) .then(res => console.log(res)) .catch(error => console.error(error)); }) .catch(error => console.error(error)); }) .catch( error => console.error(error)); </code></pre> <p>index.jsを実行し、ログにエラーが含まれていないこと、Studioのフローが実際に変更されていることを確認しましょう。</p> <pre><code>node index.js </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ご覧いただいたように、パブリックベータとして公開されたREST API v2を活用することで、外部のデータやシステムと連携した上でTwilio Studioのフローを更新することができるようになりました。非常に強力なAPIなので、ぜひご活用ください。</p> <p>今回のサンプルはこちらの<a target="_blank" rel="nofollow noopener" href="https://github.com/neri78/twilio-studio-google-spreadsheet">GitHubリポジトリ</a>からクローンし、環境変数にそれぞれ値を設定することで確認することも可能です。</p> <h2 id="新型コロナウイルス感染症への支援策について"><a href="#%E6%96%B0%E5%9E%8B%E3%82%B3%E3%83%AD%E3%83%8A%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9%E6%84%9F%E6%9F%93%E7%97%87%E3%81%B8%E3%81%AE%E6%94%AF%E6%8F%B4%E7%AD%96%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">新型コロナウイルス感染症への支援策について</a></h2> <p>Twilioでは新型コロナウィルス感染症により引き起こされるさまざまな社会問題を解決する会社、団体、開発者グループに向けて無料クレジットの進呈など支援を行なっています。詳しくは<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/covid-19-response-japan">こちらの記事</a>をご覧ください。</p> <p>また、Twilioを自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/japan/help/sales">営業部までお問い合わせ</a>ください。</p> <h2 id="このエントリについての問い合わせ"><a href="#%E3%81%93%E3%81%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B">このエントリについての問い合わせ</a></h2> <p>不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで!</p> <ul> <li>Twitter (<a target="_blank" rel="nofollow noopener" href="https://twitter.com/neri78">@Neri78</a>)</li> <li>Email: <a target="_blank" rel="nofollow noopener" href="mailto:dikehara@twilio.com">[email protected]</a></li> <li>Github: <a target="_blank" rel="nofollow noopener" href="https://github.com/neri78">https://github.com/neri78</a></li> <li>Twitch: <a target="_blank" rel="nofollow noopener" href="https://twitch.tv/neri78">https://twitch.tv/neri78</a></li> </ul> Neri78 tag:crieit.net,2005:PublicArticle/15903 2020-05-20T16:34:57+09:00 2020-05-20T18:07:54+09:00 https://crieit.net/posts/google-spreadsheet-sheets-api GoogleスプレッドシートからNode.jsでシフトデータを読み出す方法 <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/JfSEBIrPI4CAu3k18bqViRLlvPl1fZIbJ9LpKwl1J86O0d.width-808.png" alt="Header Image" /><br /> <a target="_blank" rel="nofollow noopener" href="https://console.cloud.google.com/?hl=ja">Google Cloud Platform(GCP)</a>には<a target="_blank" rel="nofollow noopener" href="https://developers.google.com/sheets/api">Google Sheets API</a>が提供されており、このAPIを利用してGoogleスプレッドシートのデータにアクセスすることができます。今回はGoogleスプレッドシートのスタッフ、シフトデータをNode.jsで読み込む方法を紹介します。</p> <p>前提条件</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://console.cloud.google.com/?hl=ja">Google Cloud Platform (GCP)のアカウント</a>の作成、ならびに有効な支払い方法が登録されていること</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.google.com/intl/ja_jp/sheets/about/">Googleスプレッドシート</a>を利用できること</li> </ul> <h2 id="シフトを管理するGoogleスプレッドシート"><a href="#%E3%82%B7%E3%83%95%E3%83%88%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8BGoogle%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88">シフトを管理するGoogleスプレッドシート</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://docs.google.com/spreadsheets/d/1KHozXisufSbldqeTtkTO3-fRT9McdVxrzVz7YyCWSqM/edit?usp=sharing">こちら</a>にスプレッドシートのサンプルを用意しました。ファイルメニューからこのスプレッドシートを自分のGoogleアカウントで利用できるようにコピーします。スプレッドシートの中身をみてみましょう。Shiftシートには日ごとの担当者を4名まで設定しています。<br /> <img src="https://twilio-cms-prod.s3.amazonaws.com/images/JTcbF8FiG0AyceVQcR4FQNszfxEwj5zwFtf9w0KPLfcwJj.width-800.png" alt="Google Spreadsheet - Shift" /></p> <p>また、Staffシートには担当者ごとの連絡先電話番号が<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/docs/glossary/what-e164">E.164フォーマット</a>で登録されています。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/-ke-JpIzwIkEdVu41E8aa4OsC8YPLq9zHavppvy7FuI04C.width-800.png" alt="Google Spreadsheet - Staff" /></p> <h2 id="GCPでSheets APIを有効化"><a href="#GCP%E3%81%A7Sheets+API%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96">GCPでSheets APIを有効化</a></h2> <p>はじめてGCPを利用する場合は、<a target="_blank" rel="nofollow noopener" href="https://console.cloud.google.com/cloud-resource-manager">コンソール</a>からプロジェクトを作成します。<br /> <img src="https://twilio-cms-prod.s3.amazonaws.com/images/ooE7wJ3JEVutwUGFPfuZC9JorRaxWpFOD4K4DS9syz0L99.width-800.png" alt="GCP - Create a project" /></p> <p>例ではプロジェクト名を <code>google-sheet-studio</code> としましたが、任意のプロジェクト名で構いません。<br /> <img src="https://twilio-cms-prod.s3.amazonaws.com/images/AfZdHBVKjtKyGBsHpFbVGErsr-LOfmrkXp5xIYYN0hLnU0.width-800.png" alt="GCP - project name" /></p> <p>作成ボタンをクリックするとリソースの管理画面に戻り、プロジェクトの作成が開始されます。数十秒〜数分程度で作成が完了します。</p> <p>次に<a target="_blank" rel="nofollow noopener" href="https://console.cloud.google.com/apis/library">API ライブラリ</a>を開きます。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/GDhetd6rJRyWJZNxq1leRhhn7bwz3hqWkj74w0eeSCHQhv.width-800.png" alt="GCP - Open API Library" /></p> <p>先ほど作成したプロジェクトが選択されていることを確認します。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/F085blQIr1lxDfm7NuuO1Om1XrHR8RUZazZMvc0CRydar-.width-800.png" alt="GCP - API Library with a project" /></p> <p>Google Sheets APIを検索し、プロジェクトに追加します。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/5QjQstd86zQXHcCP_oPQVO5uIvSOipkjGwBqZjTQyKcEpL.width-800.png" alt="GCP - search sheets API" /></p> <p>詳細画面から <code>有効にする</code> ボタンをクリックするとGoogle Sheets APIが有効になります。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/iHS-ff4E5U65OLwx-Hz52VM2VCeCDb14rjwmseU2cb3C1W.width-800.png" alt="GCP - enable sheets API" /></p> <p>APIが有効化されると、概要画面に遷移します。次に <code>認証情報を作成</code> ボタンをクリックし、このAPIを使用するための認証情報を作成します。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/mdPFFkjpFUewRvZtgR4HhhwNtONnuvGvs4o3Mbb8YWXGnT.width-800.png" alt="GCP - Add auth info" /></p> <p>認証情報の追加画面において次の設定を行い、<code>必要な認証情報</code> ボタンをクリックします。</p> <ul> <li>使用する API - Google Sheets API</li> <li>API を呼び出す場所 - ウェブサーバー(node.js、Tomcat など)</li> <li>アクセスするデータの種類 - アプリケーション データ</li> <li>App Engine または Compute Engine でこの API を使用する予定はありますか? - いいえ、使用していません</li> </ul> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/d7DzQucz1snBQJBnUZ8AxaWun3kguQxe8_xf6HS2NrjFgr.width-800.png" alt="GCP - Create a service account" /></p> <p>続けてサービスアカウント名とロールを設定します。例では、<code>test</code> およびロールを <code>Project</code> の <code>閲覧者</code> とし、キーのタイプを <code>JSON</code> としました。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/y-iIsGp2LwAvFexgqbUx_lANXcg-bhKlka14JOcK1sb97D.width-800.png" alt="GCP - Create a service account - name" /></p> <p><code>次へ</code> ボタンをクリックすると認証情報を含んだJSONファイルが作成されダウンロードされます。このファイルはGoogle Sheets APIを利用するために必要になります。作成されたJSONファイルを開くと <code>client_email</code> という名前のキーの値に先ほど作成したサービス アカウント IDが記載されています。Googleスプレッドシートを共有する際にこの情報が必要になります。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/JgW7p51hA5u-4yggqHymFjLMI_rGBvu0wAHDCpVJXsZeJq.width-800.png" alt="gcp - service account" /></p> <h2 id="Googleスプレッドシートの共有とURLや情報の確認"><a href="#Google%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%E5%85%B1%E6%9C%89%E3%81%A8URL%E3%82%84%E6%83%85%E5%A0%B1%E3%81%AE%E7%A2%BA%E8%AA%8D">Googleスプレッドシートの共有とURLや情報の確認</a></h2> <p>次に、Google Sheets APIからアクセスをできるようにGoogleスプレッドシートをサービス アカウントに共有します。先ほど複製したGoogleスプレッドシートを開き、右上の <code>共有</code> ボタンをクリックします。表示された共有ダイアログに先ほどのサービス アカウント IDを入力します。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/eNfWeKahkSszuRfCxD4PgtaVRVJm-vLmfv19RvvXM4xgxb.width-800.png" alt="Google Spreadsheet - share the sheet" /></p> <p>Enterキーを押すと、権限の設定を行えます。書き込み権限は必要ないため閲覧者としました。<code>共有</code> ボタンをクリックし、共有を完了します。</p> <p><img src="https://twilio-cms-prod.s3.amazonaws.com/images/z5tAPOALrfoTztQVwEDWn1fmusPZP25PbsepJd8VsMp8P7.width-800.png" alt="Google Spreadsheet - share as a viewer" /></p> <p>更に、このGoogleスプレッドシートから次の情報を控えておきます。</p> <ul> <li>スプレッドシートID(https://docs.google.com/spreadsheets/d/ の後に表示されている英数文字列のうち、次の’/’ の前の値。例: https://docs.google.com/spreadsheets/d/ <strong>12312321xxx21232131212</strong> /edit#gid=0 の太字部分)</li> <li>Shift、StaffそれぞれのワークシートのID(URLが <strong>#gid=0</strong> の場合は、 <strong>0</strong> となる )</li> </ul> <p>これでシートから情報を取得する前準備が整いました。</p> <h2 id="Node.jsプロジェクトの作成とパッケージのインストール"><a href="#Node.js%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Node.jsプロジェクトの作成とパッケージのインストール</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://developers.google.com/sheets/api">Google Sheets API</a>を利用することでGoogleスプレッドシートのデータにアクセスすることができます。このAPIに対応する<a target="_blank" rel="nofollow noopener" href="https://github.com/googleapis/google-api-nodejs-client/tree/master/src/apis/sheets">Node.jsクライアントライブラリ</a>も用意されており、<a target="_blank" rel="nofollow noopener" href="https://developers.google.com/sheets/api/quickstart/nodejs">クイックスタート</a>のようにセルの値を取得することもできるのですが、取得するセルの範囲を指定する必要があり、使いにくいと感じるかもしれません。そのため、今回はGoogle Sheets APIを使いやすくラップした<a target="_blank" rel="nofollow noopener" href="https://developers.google.com/sheets/api/quickstart/nodejs">google-spreadsheet</a>パッケージを利用します。このパッケージを利用すると、セルの範囲を指定することなく、ワークシートから行オブジェクトとしてデータを読み込むことができます。</p> <p>Node.jsアプリケーションを作成し、<a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/google-spreadsheet">google-spreadsheet</a>と環境変数を.envファイルからロードできる<a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/dotenv">dotenv</a>パッケージをインストールします。</p> <pre><code class="bash">npm i google-spreadsheet dotenv </code></pre> <p>次にGoogleスプレッドシートやシートのIDを記録しておく.envファイルを作成します。</p> <pre><code class="bash">touch .env </code></pre> <p>.envファイルには次の環境変数を追加しておきます。</p> <pre><code>SPREADSHEET_ID= SHIFT_WORKSHEET_ID= STAFF_WORKSHEET_ID= </code></pre> <p><code>SPREADSHEET_ID</code>、<code>STAFF_WORKSHEET_ID</code>、<code>SHIFT_WORKSHEET_ID</code> には先ほど控えておいたGoogleスプレッドシートのIDやそれぞれのシートのIDを追加します。</p> <p>最後にGCPからダウンロードしたJSONファイルをプロジェクトフォルダーにコピーし、わかりやすいように名前を <code>credentials.json</code> と変更します。これで準備完了です。</p> <h2 id="Googleスプレッドシートからシフト表を取得"><a href="#Google%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%8B%E3%82%89%E3%82%B7%E3%83%95%E3%83%88%E8%A1%A8%E3%82%92%E5%8F%96%E5%BE%97">Googleスプレッドシートからシフト表を取得</a></h2> <p>ここからはGoogleスプレッドシートからシフト表を取得するコードを実装します。Node.jsアプリケーションに新しくjsファイルを追加します。<code>index.js</code> という名前で作成しました。</p> <pre><code class="bash">touch index.js </code></pre> <p>index.jsをエディタで開き、環境変数の読み込みや必要なパッケージをインポートします。</p> <pre><code class="js">'use strict'; require('dotenv').config(); const { GoogleSpreadsheet } = require('google-spreadsheet'); </code></pre> <p>次にGoogleスプレッドシートからシフトデータを読み取り、担当者の電話番号を返す非同期関数を実装します。</p> <pre><code class="js">// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得 async function loadShiftPhoneNumbers() { // 処理を実装 } </code></pre> <p>この <code>loadShiftPhoneNumbers</code> 関数でGoogleスプレッドシートをロードします。ここでGCPへの接続に必要になるのが先ほどコピーし、名前を変更した <code>credentials.json</code> です。</p> <pre><code class="js">// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得 async function loadShiftPhoneNumbers() { // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID); const credentials = require('./credentials.json'); await doc.useServiceAccountAuth(credentials); await doc.loadInfo(); } </code></pre> <p>ワークシートを取得する場合は、<a target="_blank" rel="nofollow noopener" href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet?id=worksheets">GoogleSpreadsheet.sheetsById、またはGoogleSpreadsheet.sheetsbyIndex</a>を利用できます。さらに、<a target="_blank" rel="nofollow noopener" href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet?id=fn-getrows">GoogleSpreadsheetWorksheet.getRows</a>メソッドを使用し、ワークシートの行を取得できます。残念ながら特定の列の値をキーにフィルタリングはできないようなので全ての行を取得します。</p> <pre><code class="js">// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得 async function loadShiftPhoneNumbers() { // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID); const credentials = require('./credentials.json'); await doc.useServiceAccountAuth(credentials); await doc.loadInfo(); //シフト情報を取得 const shiftSheet = await doc.sheetsById[process.env.SHIFT_WORKSHEET_ID]; const shiftRows = await shiftSheet.getRows(); // 従業員情報を取得 const staffSheet = await doc.sheetsById[process.env.STAFF_WORKSHEET_ID]; const staffRows = await staffSheet.getRows(); } </code></pre> <p><a target="_blank" rel="nofollow noopener" href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet?id=fn-getrows">GoogleSpreadsheetWorksheet.getRows</a>メソッドはGoogleSpreadsheetRowの配列を返します。また、この<a target="_blank" rel="nofollow noopener" href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-row">GoogleSpreadsheetRow</a>オブジェクトは最初の行をプロパティのキーとしてアクセスできるため、<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find">Array.prototype.find()</a>メソッドを利用し、Date列をキーとして特定の日付のデータを抜き出すことができます。この記事では、2020年5月15日を例として取得します。実際のアプリケーションでは <code>new Date()</code> などを利用し、当日のデータを取得することになるでしょう。</p> <pre><code class="js">// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得 async function loadShiftPhoneNumbers() { // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID); const credentials = require('./credentials.json'); await doc.useServiceAccountAuth(credentials); await doc.loadInfo(); //シフト情報を取得 const shiftSheet = await doc.sheetsById[process.env.SHIFT_WORKSHEET_ID]; const shiftRows = await shiftSheet.getRows(); // 従業員情報を取得 const staffSheet = await doc.sheetsById[process.env.STAFF_WORKSHEET_ID]; const staffRows = await staffSheet.getRows(); // シフト情報からDate列の値と指定した日付をロケール情報に基づいて取得 let shiftRow = shiftRows.find(row => new Date(row.Date).toLocaleDateString() === new Date('2020/5/15').toLocaleDateString()); } </code></pre> <p>あとは、取得した行から必要なデータを読み取り、アプリケーションで使用できます。</p> <p>データの活用例として、このシフトデータから担当者の電話番号をカンマ区切りの文字列で取得する方法も実装します。</p> <p><code>shiftRow.Employee1</code>のように各列のキーを指定してデータを取得することもできますが、<code>shiftRow._rawData shiftRow</code> には、行のデータが配列として保持されています。2020年5月15日のデータは、<code>['5/15/2020', 'Mitsuharu', 'Yoshihiro']</code> となります。この配列を<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice">Array.prototype.slice()</a>メソッドで最初の日付データを除外した配列とし、さらに、<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map">Array.prototype.map()</a>メソッドでシフト担当の従業員の電話番号の配列へと変換します。そして、最後に、<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join">Array.prototype.join()</a>メソッドで文字列として返すという処理を実装しました。</p> <pre><code class="js">// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得 async function loadShiftPhoneNumbers() { // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID); const credentials = require('./credentials.json'); await doc.useServiceAccountAuth(credentials); await doc.loadInfo(); //シフト情報を取得 const shiftSheet = await doc.sheetsById[process.env.SHIFT_WORKSHEET_ID]; const shiftRows = await shiftSheet.getRows(); // 従業員情報を取得 const staffSheet = await doc.sheetsById[process.env.STAFF_WORKSHEET_ID]; const staffRows = await staffSheet.getRows(); // シフト情報からDate列の値と指定した日付をロケール情報に基づいて取得 let shiftRow = shiftRows.find(row => new Date(row.Date).toLocaleDateString() === new Date('2020/5/15').toLocaleDateString()); // 元データ['5/15/2020', 'Mitsuharu', 'Yoshihiro'] // Date列(最初の列)を取り除き、シフト担当の従業員を含む配列を取得する let employeesOnDuty = shiftRow._rawData.slice(1); // ['Mitsuharu', 'Yoshihiro'] // 名前から電話番号の配列に置換 employeesOnDuty = employeesOnDuty.map(m => staffRows.find(row => row.Name === m).PhoneNumber); // ['+815012341235', '+815012341237'] return employeesOnDuty.join(',');} </code></pre> <p>ここまで実装を終えた段階で、きちんとデータを読み込めるかどうかを確認しましょう。<br /> loadShiftNumbers関数のスコープ外に次のコードを追加します。</p> <pre><code class="js">// 実装した関数が正しく動作するかテスト loadShiftPhoneNumbers() .then (numbers => console.log(numbers)) .catch(error => console.error(error)); </code></pre> <p>index.jsを実行し、次のような結果がコンソールに出力されていれば成功です。</p> <pre><code>node index.js </code></pre> <p>実行結果</p> <pre><code>+815012341235,+815012341237 </code></pre> <p>想定した結果が得られない場合は、出力されたエラーを参考にGCPの設定や、JSONファイルの読み込みなどを確認してください。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ご覧いただいたように、Google Sheets APIを使うことでGoogleスプレッドシートをデータソースとしたアプリケーションを構築することができます。ぜひご活用ください。</p> <h2 id="このエントリについての問い合わせ"><a href="#%E3%81%93%E3%81%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B">このエントリについての問い合わせ</a></h2> <p>不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで!</p> <ul> <li>Twitter (<a target="_blank" rel="nofollow noopener" href="https://twitter.com/neri78">@Neri78</a>)</li> <li>Email: <a target="_blank" rel="nofollow noopener" href="mailto:dikehara@twilio.com">[email protected]</a></li> <li>Github: <a target="_blank" rel="nofollow noopener" href="https://github.com/neri78">https://github.com/neri78</a></li> <li>Twitch: <a target="_blank" rel="nofollow noopener" href="https://twitch.tv/neri78">https://twitch.tv/neri78</a></li> </ul> Neri78 tag:crieit.net,2005:PublicArticle/15882 2020-04-30T11:08:39+09:00 2020-04-30T12:33:47+09:00 https://crieit.net/posts/Twilio-Studio Twilio Studioを使って問い合わせ番号への着信を複数の番号に転送する方法 <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/-r4M521xt0Q107mAzWyHtOxJM-AYhMXgxB32oo0RQVPvX2.width-808.png" /> </div> <h2 id="在宅勤務と電話応対の難しさ"><a href="#%E5%9C%A8%E5%AE%85%E5%8B%A4%E5%8B%99%E3%81%A8%E9%9B%BB%E8%A9%B1%E5%BF%9C%E5%AF%BE%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95">在宅勤務と電話応対の難しさ</a></h2> <p>新型コロナウイルス感染症(COVID-19)の拡大に伴う緊急事態宣言が東京、大阪、福岡を含む7都道府県を対象として発出されました。(2020年4月14日現在)この宣言を受けて在宅勤務の開始とそれに伴う電話対応の一時休止が多くの企業から<a target="_blank" rel="nofollow noopener" href="https://www.google.com/search?q=%E7%B7%8A%E6%80%A5%E4%BA%8B%E6%85%8B%E5%AE%A3%E8%A8%80+%E9%9B%BB%E8%A9%B1+%E4%B8%80%E6%99%82%E4%BC%91%E6%AD%A2">アナウンス</a>されています。チャットやSMSを活用することでこれまでの顧客対応を一部担うことはできるものの、利用できるコミュニケーションチャネルが電話のみという場合、お客様への対応に頭を悩ます場合も多いのではないでしょうか。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/SQ3HmQXlEPyk02wHmwS2iARE3idp8tHj-rk09QIvLotML4.width-500.png" /> </div> <p>もちろん、各事業者が提供する電話転送サービスなどを利用することで、代表番号からの転送を設定することは可能です。しかし、担当者の欠勤や休暇への対応など、転送設定を柔軟に運用するためには課題が残ります。また、リモートで設定ができない場合は、リスクを取って事業所まで外出し、設定を行うということも考えられます。特に中小規模の組織にとっては頭の痛い問題ではないでしょうか。</p> <p>今回は、電話番号をTwilioから取得し、Twilio Studioを使って期間限定の問い合わせ窓口を開設し、着信を複数の担当者の電話回線に転送する方法を紹介します。ポイントは手軽さと設定の柔軟性です。</p> <h2 id="前提条件"><a href="#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6">前提条件</a></h2> <ul> <li>Twilioアカウントを持っていること(<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/how-to-create-twilio-account-jp">無料トライアルのサインアップ方法</a>)</li> <li>期間限定の問い合わせ番号となる<a target="_blank" rel="nofollow noopener" href="https://support.twilio.com/hc/en-us/articles/360044841214-Twilio-%E3%83%95%E3%83%AA%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6">電話番号を購入</a>していること<br /> (<a target="_blank" rel="nofollow noopener" href="https://support.twilio.com/hc/en-us/articles/360044400214-%E8%A6%8F%E5%88%B6%E6%83%85%E5%A0%B1%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E6%9B%B8%E9%A1%9E%E3%81%AE%E6%8F%90%E5%87%BA%E6%96%B9%E6%B3%95">日本の番号を取得する場合</a>)</li> </ul> <h2 id="Twilio Studioを使った電話転送"><a href="#Twilio+Studio%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%9B%BB%E8%A9%B1%E8%BB%A2%E9%80%81">Twilio Studioを使った電話転送</a></h2> <p>Twilio Studioは電話やSMSなどの着信応答を設定することができるノンコーディーングツールです。今回のような転送設定を行う場合はプログラミングの知識を必要としません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/console/">Twilioコンソール</a>から<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/console/studio/dashboard">Studioダッシュボード</a>を開き、赤色の<code>Create a flow</code>ボタンをクリックし、新しいFlowの作成を開始します。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/HnJ8FCupyTmRI73nucAniFO5x2ccUx5vgeJ60gDZYQuNLj.width-800.png" /> </div> <p>Flowの名前はCall Forwardingとしました。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/pUTnjlCe5tMmuB-kSRFWB7pw_MblotSRuditek_0Sv3LKu.width-500.png" > </div> <p>Studioにはいくつかテンプレートが用意されているため、目的に合えば最小限の項目設定で運用を開始できます。少しスクロールすると表示される<code>Call Forwarding</code>テンプレートを選択し、<code>Next</code>ボタンをクリックします。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/Eiyw7Un8tFz_ELhIOH5CRlDHKV5UdEXsc0IX1P8AqHBXsI.width-500.png" > </div> <p>あらかじめ、<code>Connect Call To</code>というウィジェットが配置されたデザイン画面が表示されます。このデザイン画面では右側の<code>WIDGET LIBRARY</code>からウィジェットをドラッグ&ドロップし、複雑なコールフローを設定できます。</p> <p>今回の記事では特にウィジェットを追加しないまま進めます。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/47Q77dMKvOPmkeTbMRMC-963vP_3abPlEbmQ_lsJ5iZFZB.width-800.png" /> </div> <p>次に<code>forward_call</code>と名前がつけられているウィジェットをクリックしましょう。WIDGET LIBRARYが表示されていたパネルが、選択したウィジェットの設定項目表示パネルに切り替わります。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/kCSo93QknPRiCSwsH8yjdNVAEuhB59efcquAsS_lUZSmmO.width-800.png" /> </div> <p>このウィジェットは現在の通話を別の番号(単数、複数)や、Client User(別のTwilio Client)、SIM、SIPエンドポイント、あるいはカンファレンスコールに接続させることができます。今回は複数の番号に転送したいため、<code>CONNECT CALL TO</code>を<code>Multiple Numbers (Simulring)</code>に、<code>PHONE NUMBERS OR CLIENTS</code>に複数の電話番号をカンマ(,)区切りで設定しました。この際、電話番号は<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/docs/glossary/what-e164">E.164フォーマット</a>で指定する必要があります。</p> <p>(例)050-3196-5549 → +815031965549</p> <p>また、複数の番号に転送する場合は、同時に転送するわけでなく、Call Per Second(CPS)と呼ばれる1秒間あたりの発信数に則り転送されます。現在の設定は<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/console/voice/settings">コンソール</a>で確認できます。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/sMJnJ-5r19sErMZNxfAAyYdREQ2DYUXMkbddlTNE-lv_yT.width-500.png" /> </div> <p>つぎに発信者ID(CALLER ID)を設定しましょう。この項目は転送先の携帯電話等に表示される発信元の番号になります。本来であれば 電話をかけてきたお客様の番号を表示できれば良いのですが、一般電話回線にTwilio Studioを用いた電話の転送を行なった場合、発信者の偽装になりかねないため、残念ながら「非通知」と表示されてしまいます。</p> <p>これでは本当に非通知なのか、Twilio Studioで転送された着信かどうかがわからず不便ですよね。そのため、代替策として、<code><span>{</span><span>{</span>trigger.call.To<span>}</span><span>}</span></code>と指定し、期間限定の問い合わせ番号として設定する番号、すなわち転送に利用したTwilioの電話番号が表示されるようにします。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/vqsgIEHHpNYsIWhVeClQ0SVqRYiN-irI2NLN9FQVgcG8RX.width-500.png" /> </div> <p>これでStudioの設定は完了です。ウィジェットの<code>Save</code>ボタンで変更を保存するとともに、画面上の<code>Publish</code>ボタンでフローを公開できます。忘れないように <strong>Publish</strong> してください。</p> <p>さて、残るは電話番号の設定です。事前に購入している電話番号の詳細画面を電話番号コンソールから開き、Voiceセクションの<code>A CALL COMES IN</code>で <code>Studio Flow</code>を選択します。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/Screen_Shot_2020-04-16_at_11.59.23.width-800.png" /> </div> <p>続けて先ほど設定したフローを選択します。</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/MCU5qg0Ca3tQ3G3L9FiXKmUnD2Nb3XflO7Go4smaEArT7s.width-800.png" /> </div> <p>おっと、忘れずに<code>Save</code>ボタンを押しましょう。この番号に転送先でない番号から電話をかけて動作を確かめたら、Webサイトの更新ですね!</p> <div style="text-align:center;" > <img src="https://twilio-cms-prod.s3.amazonaws.com/images/IUKn_nlsgm9ZqQDfPcJD3sRxymcmkczubLI4jsW-_KVlXU.width-500.png" /> </div> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Twilio Studioを利用すれば期間限定の問い合わせ番号の設置と電話転送をリモートで設定できます。スタッフの休暇やシフトに合わせて転送先をStudioを利用し手動で簡単に変更できます。また、<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/docs/studio/rest-api">Studio API</a>も提供されているので外部のプログラムからフローを制御できます。</p> <p>さらに、色々な手法を組み合わせることで単純な転送だけではなくより複雑なフローも設定できます。Qiitaにもいろいろと記事が公開されていますので参考になれば幸いです。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/Hsu_86/items/874abef2125194f2c462">TwilioStudio ワークショップ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mobilebiz/items/c2c766fb9c3da9693ca0">Twilio FunctionからStudio Flowを呼び出す</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mobilebiz/items/f1d6cf55c1f544c9bd7a">Clova Extensions Kit(CEK)とTwilio Functionsを連携して、ClovaからStudioを呼び出す</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/friendtree16/items/7c733c6d7343e6be9c0f">TwilioStudioで作ったIVRフローでサーバーのレスポンスを使って流してみた</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mobilebiz/items/a40ec9ae19546deb2b51">モーニングコールをノンコーディングで作る</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mobilebiz/items/afddab8bd873008307ca">TwilioStudio内で変数を扱う方法</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ko2a/items/c70f539e1e43709c3147">Wio Node と TwilioStudio で簡単な IoT システムを組んでみる</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/su-bell/items/cdc9c044af03118eb412">TwilioStudioで留守中に電話があったらslackに通知する仕組みを作ってみた</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mobilebiz/items/8757eec854f37ce0cb2d">Twilio FunctionsとStudioを使って連続架電を行う</a></li> </ul> <h2 id="新型コロナウイルス感染症への支援策について"><a href="#%E6%96%B0%E5%9E%8B%E3%82%B3%E3%83%AD%E3%83%8A%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9%E6%84%9F%E6%9F%93%E7%97%87%E3%81%B8%E3%81%AE%E6%94%AF%E6%8F%B4%E7%AD%96%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">新型コロナウイルス感染症への支援策について</a></h2> <p>Twilioでは新型コロナウィルス感染症により引き起こされるさまざまな社会問題を解決する会社、団体、開発者グループに向けて無料クレジットの進呈など支援を行なっています。詳しくは<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/blog/covid-19-response-japan">こちらの記事</a>をご覧ください。</p> <p>また、Twilioを自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、<a target="_blank" rel="nofollow noopener" href="https://www.twilio.com/japan/help/sales">営業部までお問い合わせ</a>ください。</p> <h2 id="このエントリについての問い合わせ"><a href="#%E3%81%93%E3%81%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B">このエントリについての問い合わせ</a></h2> <p>不明点があればぜひ、お問い合わせください。オンラインでの登壇依頼等もお待ちしてます♪</p> <ul> <li>Twitter (<a target="_blank" rel="nofollow noopener" href="https://www.twitter.com/neri78">@Neri78</a>)</li> <li>Email: <a target="_blank" rel="nofollow noopener" href="mailto:dikehara@twilio.com">[email protected]</a></li> <li>Github: <a target="_blank" rel="nofollow noopener" href="https://github.com/neri78">https://github.com/neri78</a></li> </ul> Neri78