こんにちは、長塚電話工業所の佐藤です。
新年度より新設されたデジタルサポート課に配属となりました。
DX推進や自動化・効率化など、これまで以上に組織へアプローチすることができればと思っています。
さて、これまでにもAPIを活用したSaaS連携の記事は書いてきましたが、言語としてPythonを利用していました。
しかし、ローカル環境構築に一苦労、定期自動実行のためのAWSセットアップに一苦労と、言語自体は便利であるにも関わらず下準備がとにかく大変という課題があります。
そこで今回はサーバーレスで実行可能な「Google Apps Script」を使用して、Kintoneとの連携を実現したいと思います!出力結果のメール送信やTeams連携などは、後編の記事でご紹介します。
Google Apps Scriptとは?
Google Apps Script(GAS)は、Google Workspaceの各種サービス(Google Sheets、Docs、Calendar、Gmailなど)をプログラム的に操作するためのJavaScriptベースのスクリプト言語です。このプラットフォームを使うことで、Googleのクラウドサービスに対してカスタム機能を追加したり、自動化したり、拡張したりすることができます。主な特徴として以下のような点が挙げられます:
- アクセシビリティ:
- Google Apps Scriptはブラウザを通じてアクセスできるため、特別なソフトウェアのインストールが不要です。
- 統合性:
- Google Workspaceの各アプリケーションとシームレスに連携し、それらをスクリプトから直接制御できるため、データの移動や変換が容易になります。
- 拡張性:
- Google Apps Scriptはカスタム関数の作成、ユーザーインターフェースのカスタマイズ、外部APIとの連携など、多様な拡張機能を提供します。
- 自動化:
- 定期的なレポート生成、フォームの自動処理、メールの一斉送信など、多くの繰り返し作業を自動化できます。
- トリガーとイベント:
- 特定の条件やアクションが発生したときにスクリプトを自動実行させるトリガーを設定できます。例えば、スプレッドシートが更新されたときに自動的にスクリプトが実行されるよう設定することが可能です。
- 開発者向け機能:
- より複雑なスクリプトやアプリケーションを開発するためのIDE(統合開発環境)が提供され、デバッグやバージョン管理もサポートされます。
Javascriptベースなので、対応しているAPIならそのまま利用できます。したがって、KintoneのAPIもGASを記述して実行できるのです。
先ほど「サーバーレス」と記述しましたが、これがGASにおける最大のメリットでして、プログラムを記述するためのローカル環境を構築する必要も無ければ、プログラムを定期的に実行するためのサーバーも必要ありません。
具体的には、以下の作業から一気に解放されます。
- ローカル環境でエディタ(VSCodeなど)の準備
- エディタ内で対応言語を記述するための拡張機能のインストール
- オンプレミスサーバーやクラウド実行環境の準備(これが一番大変)
大まかな説明はこのあたりにして、本題に入りましょう!
今回実現すること
Google Apps Scriptを利用して、Kintoneからレコード一覧を取得し、スプレッドシートに保存する
これが実現できるとどのようなメリットがあるか?以下に記載します。
- 特定条件を満たしたレコードを抽出可能
- 特定の条件を満たしたレコードのURLをTeamsやSlack、Chatworkへ自動送信
- Looker Studioなどのデータ分析ツールとスムーズな連携が可能
まず、データをスプレッドシートに保存することで、GASで自在にデータ操作が可能な状態にすることができます。データの中身を確認して、例えば「ステータスがAになっている」レコードのみを抽出する、なんてことが可能です。
整形してきれいにしたデータはもちろん、内容をTeamsやSlackなどのコミュニケーションツールへ送信することができます。手作業でやっていたのであれば、自動化するチャンスです。
データ分析ツールともスムーズに連携ができます。例えば定期的に注文書のレコード一覧を取得して、どこの企業様からの注文があったか?金額はどのくらいか?これらを全て自動で集計し、レポートにしてしまうことだって可能です。夢が広がりますね!
では、早速コード詳細を見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | // Kintoneのドメイン、APIトークン、アプリIDを設定 var KINTONE_DOMAIN = 'domain.cybozu.com'; var API_TOKEN = 'your-api-token'; var APP_ID = 'your-app-id'; // APIのエンドポイントURLを構築 var url = `https://${KINTONE_DOMAIN}/k/v1/records.json`; // Kintoneからレコードを取得し、Google スプレッドシートに書き込む関数 function getKintoneRecords() { var allRecords = []; var offset = 0; var limit = 100; // 1回のリクエストで取得する最大レコード数 // APIリクエスト用のヘッダー var headers = { "X-Cybozu-API-Token": API_TOKEN }; do { // APIリクエストパラメータ var params = { 'app': APP_ID, 'query': `order by $id asc limit ${limit} offset ${offset}` // レコードの取得条件 }; // リクエストオプション var options = { 'method': 'get', 'headers': headers, 'muteHttpExceptions': true }; // APIリクエストを送信 var response = UrlFetchApp.fetch(url + '?' + encodeQuery(params), options); var data = JSON.parse(response.getContentText()); if ('records' in data) { var records = data['records']; allRecords = allRecords.concat(records.map(function(record) { var processedRecord = {}; Object.keys(record).forEach(function(key) { processedRecord[key] = record[key].value; // レコード内の値だけを抽出 }); return processedRecord; })); if (records.length < limit) { break; // 全レコードの取得が完了した場合、ループを終了 } offset += limit; // 次のリクエストのためにオフセットを更新 } else { Logger.log('Error occurred: ' + data['message']); // エラー発生時のログ break; } } while (true); writeToSheet(allRecords); // 取得したデータをスプレッドシートに書き込む } // リクエストパラメータをクエリストリングにエンコードする関数 function encodeQuery(params) { return Object.keys(params).map(function(key) { return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]); }).join('&'); } // 取得したデータをスプレッドシートに書き込む関数 function writeToSheet(data) { var spreadsheet = SpreadsheetApp.openById("your-spreadsheet-id"); var sheet = spreadsheet.getActiveSheet(); sheet.clear(); // シートをクリア if (data.length > 0) { var headers = Object.keys(data[0]); sheet.appendRow(headers); // ヘッダー行の追加 data.forEach(function(row) { sheet.appendRow(headers.map(function(header) { return row[header]; // データ行の追加 })); }); } } |
- var KINTONE_DOMAIN = ‘domain.cybozu.com’;
- var API_TOKEN = ‘your-api-token’;
- var APP_ID = ‘your-app-id’;
- var spreadsheet = SpreadsheetApp.openById(“your-spreadsheet-id”);
ここを書き換えれば、とりあえずは動いてくれると思います。
今回は以上になります。最後までお読みいただきありがとうございました。
後編へ続きます!(現在作成中)