Twilio Functionsからkintoneに対して読み書きする方法

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

電話やSMS、チャットやFAXなどのクラウド型コミュニケーションAPIを提供するTwilioと、同じくクラウド型ビジネスアプリ作成ツールであるkintoneは、とても相性がよい組み合わせです。電話やチャットなど、ビジネスにおける「フロー」を制御するTwilioと、データを「ストック」して分析するkintoneは、お互いを補完し合う仲と言えるでしょう。

この記事では、Twilioのサーバーレスプログラム実行環境である「Twilio Functions」と、kintoneのAPIを連携させて、Functionsからkintone上のデータにアクセスする方法について記載しています。
Twilio FunctionsはNode.jsベースの開発環境となりますので、今回はkintoneのNode.jsライブラリ「[kintone-nodejs-sdk](https://developer.cybozu.io/hc/ja/articles/360000511243-kintone-API-SDK-%CE%B2-for-Node-js)」を利用します。
kintone-nodejs-sdkの概要については、[こちらのドキュメント](https://developer.cybozu.io/hc/ja/articles/360000511243-kintone-API-SDK-%CE%B2-for-Node-js)が参考になります。

## 必要なもの

- Twilioトライアルアカウント（取得方法は[こちら](https://www.youtube.com/watch?v=rNiaLjnhlB4)）
- kintone開発者ライセンス（取得方法は[こちら](https://developer.cybozu.io/hc/ja/articles/200929540-developer-network-%E3%81%B8%E3%82%88%E3%81%86%E3%81%93%E3%81%9D#step3)）

どちらも通常のアカウントでももちろん構いません。

## kintone側の準備

今回はサンプルデータとして準備されている「顧客リスト」を使っていきます。

### 新しいアプリの作成

- 登録済みの開発者ライセンスを使ってkintoneにログインします。
- サービス画面が表示されたら、**kintone**に入ります。

<img width="831" alt="スクリーンショット 2018-08-06 08.45.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/7db5ae0e-4854-5f09-5b11-5e9d8b9fb80d.png">

- **アプリ**の右側にある**+**アイコンを押して、新しいアプリを作成します。
- **kintoneアプリストア**が表示されたら、**おすすめのアプリ**の中の**顧客リスト**を選択します。

<img width="986" alt="スクリーンショット 2018-08-06 08.46.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/5f009dfe-d742-125d-474f-e18b2c406a1a.png">

- 左側に表示されている**このアプリを追加**ボタンを押します。（**サンプルデータを含める**はチェックしておきます）
- **アプリの追加**ダイアログが表示されたら、**追加**ボタンを押します。

<img width="602" alt="スクリーンショット 2018-08-06 08.49.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/78b5db1a-0ee1-a91d-ced9-72c4a6d7e691.png">

- ポータル画面に戻り、アプリの欄に今追加した**顧客リスト**が表示されていることを確認します。

<img width="562" alt="スクリーンショット 2018-08-06 08.50.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/8ceb144a-6e60-441f-9a35-67192a22e39c.png">

### APIトークンの取得

kintoneを外部からアクセスするためのAPIトークンを取得します。

- アプリの中から先程追加した**顧客リスト**を選択します。
- 顧客一覧が表示されているすぐ上の表示されている歯車アイコンを押して、アプリの設定画面に移動します。

![kintone連携_歯車アイコン.png](https://qiita-image-store.s3.amazonaws.com/0/86046/5fb6fb59-7192-c134-274d-c598931749a7.png)

- **設定**タブに移動し、**カスタマイズ/サービス連携**の中の**APIトークンを選択します。
- **生成する**ボタンを押します。
- APIトークンが表示されます。**アクセス権**に元々チェックされている「レコード閲覧」以外に、「レコード追加」「レコード編集」「レコード削除」にもチェックを入れます。
- 後ほど使うので、表示されているAPIトークン（文字列）をメモ帳などに記録しておきます。
- 画面上部にある**保存**ボタンを忘れずに押します。

![kintone連携_APIトークン.png](https://qiita-image-store.s3.amazonaws.com/0/86046/188049f7-2155-5036-0986-67a71da949ef.png)

- アプリの設定画面に戻るので、右上にある**アプリを更新**ボタンを押します。

## Twilio側の準備

続いて、Twilio側の準備をしていきます。

- [こちらの画面](https://jp.twilio.com/login/kddi-web)からログインをして、Twilioの管理コンソールを開きます。

### Functionsの環境設定

- 左側に表示されているドットが３つ表示されているアイコンをクリックすると、スライドメニューが開きます。

![kintone連携_スライドメニューアイコン.png](https://qiita-image-store.s3.amazonaws.com/0/86046/52235af7-defd-26a6-ff62-571fb9047654.png)

- **DEVELOPER TOOLS**の中にある**Runtime**を選択します。
- その中の**Functions**を選択し、さらに**Configure**を選びます。
- **Enable ACCOUNT_SID and AUTH_TOKEN**のチェックを入れます。

<img width="329" alt="スクリーンショット 2018-08-08 15.34.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/6d4c5440-3587-ab70-e70f-f7a78aaf6f88.png">

- **Environmental Variables**の中の赤い+アイコンを２回押して、枠を２行作ります。
- 以下の内容を記載します。

|KEY|VALUE|
|:--|:--|
|KINTONE_API_TOKEN|先程控えておいたAPIトークン（文字列）|
|KINTONE_APP_URI|kintoneのURLに含まれるドメイン文字列(xxxxx.cybozu.com)|

- **Dependencies**の設定内にある、「Twilio」の**VERSION**を「3.23.1」に変更します。

<img width="689" alt="スクリーンショット 2018-08-08 17.14.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/aa04b6dc-0e76-999b-ddcc-48c112d61ec6.png">

- 更に、赤い+アイコンを１回押して、以下の内容を設定します。

|NAME|VERSION|
|:--|:--|
|kintone-nodejs-sdk|0.1.1|

- **Save**ボタンを押して、設定を保存します。


## Functionsからkintoneへのアクセス

準備が整いましたので、いよいよTwilioからkintoneのデータにアクセスしてみましょう。
今回は、すべてサンプルコードを用意したので、基本的にはコピー＆ペーストでテストできるはずです。

### kintoneデータの読み込み

まずは、kintone上に保存されているデータをTwilioから読み込むコードを書いてみます。
コードを書く前に必要な情報を整理してみます。

|項目|説明|
|:--|:--|
|kintoneアプリのドメイン名|先程Functionsの環境設定で、KINTONE_APP_URIで指定したもの|
|アプリID|kintoneの顧客リストアプリを開いた時に、URLの途中に指定されている数値（xxxxx.cybozu.com/k/1/ の「１」の部分）|
|クエリー|読み込むデータの条件を指定する文字列。例えば、電話番号が「090-1234-5678」のデータを検索するには、「TEL = '090-1234-5678'」のように指定します。このときの「TEL」は、kintoneアプリで各フィールドに設定したフィールドコードとなります。詳しいドキュメントは[このあたり](https://developer.kintone.io/hc/en-us/articles/213149287#getrecords)にあります|

ではまず、顧客リストアプリのレコード番号が７の以下のデータを検索してみたいと思います。

<img width="1429" alt="スクリーンショット 2018-08-08 21.47.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/f971e21d-7a9a-b89c-6fd7-6b1ad9e8538f.png">

レコード番号を使って検索するためには、**getRecord**というメソッドを利用します。
getRecordの使い方の詳細は、[こちら](https://kintone.github.io/kintone-nodejs-sdk/reference/record/#getrecordappid-recordid)を御覧ください。

- Twilioの管理コンソールで、先ほどと同じように**Runtime**の**Functions**を選択します。
- さらに**Manage**を選択し、**Create a new Function**もしくは、赤い＋アイコンを押して、新しいFunctionを作成します。
- テンプレートを選択するダイアログが表示されるので、**Blank**を選択した後、**Create**ボタンを押します。

<img width="802" alt="スクリーンショット 2018-08-08 21.56.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/9fbea563-33cc-5480-c583-09f617e23339.png">

- **FUNCTION NAME**欄に「getRecord」と入力します。
- **PATH**欄に「/get-record」と入力します。

<img width="593" alt="スクリーンショット 2018-08-08 21.58.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/9d262a20-6646-8162-fb6a-4e37df3a3fc1.png">


- **CODE**欄に予め書かれているコードをすべて削除し、以下のコードを貼り付けます。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);
    
    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);
    
    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください
    let recordID = 7;  // 検索したいレコード番号

    kintoneRecord.getRecord(appID, recordID)
    .then((resp) => {
        Object.keys(resp.record).forEach(function(key) {
            console.log(key, resp.record[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

- **Save**ボタンを押します。
- デプロイが自動で実行され、しばらくするとデプロイ完了の緑色のバナーが表示されれば完成です。
- **PATH**欄の右側にあるコピーアイコンをクリックしてURLをコピーします。
- ブラウザで新しいタブを開き、URLを貼り付けて実行します。
- Function側の画面に以下のようなログが表示されれば成功です（URLを貼り付けた方のタブにはOKとだけ表示されています）。

<img width="1072" alt="スクリーンショット 2018-08-08 22.25.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/67a23908-97f0-c8d6-7063-50f7f611fc38.png">

続いて、もう少し複雑な読み込みを行ってみます。
シナリオとして、住所（フィールドコード「Address」）が「栃木県」から始まるの会社名の一覧を取得してみましょう。

- **Functions**の**Manage**を選択し、赤い＋アイコンを押して、新しいFunctionを作成します。
- テンプレートを選択するダイアログが表示されるので、**Blank**を選択した後、**Create**ボタンを押します。
- **FUNCTION NAME**欄に「getRecords」と入力します。
- **PATH**欄に「/get-records」と入力します。
- **CODE**欄に予め書かれているコードをすべて削除し、以下のコードを貼り付けます。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);
    
    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);
    
    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください
    let query = `Address like "栃木県"`;
    let fieldsCode = [
        '文字列__1行_', // 会社名のフィールドコード
    ];
    let isShowTotalCount = true;

    kintoneRecord.getRecords(appID, query, fieldsCode, isShowTotalCount)
    .then((resp) => {
        if (resp.records.length === 0) {
            callback(null, `該当するデータが見つかりません`);
        } else {
            Object.keys(resp.records).forEach(function(key) {
                console.log(key, resp.records[key]);
            });
            console.log(`1件目の会社名は、${resp.records[0]['文字列__1行_'].value}です。`);
            callback(null, `${resp.totalCount}件のデータが抽出されました`);
        }
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

- **Save**ボタンを押します。
- デプロイが自動で実行され、しばらくするとデプロイ完了の緑色のバナーが表示されれば完成です。
- **PATH**欄の右側にあるコピーアイコンをクリックしてURLをコピーします。
- ブラウザで新しいタブを開き、URLを貼り付けて実行します。
- Function側の画面に以下のようなログが表示されれば成功です（URLを貼り付けた方のタブには抽出件数が表示されています）。

<img width="1069" alt="スクリーンショット 2018-08-08 22.49.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/30274935-024e-25f9-f784-899719658f82.png">

戻ってくる値は、各レコードの値がJSON形式の配列になっています。
具体的には、resp.records[*n*]の**n**が戻ってきたレコード配列のインデックスとなり、その値を取得するにはフィールドコードの**Value**値を取ればOKです（該当するレコードがない場合は、resp.records配列が空となります）。
たとえば、上の読み込みサンプルで、1件目の会社名（フィールドコードが「文字列\_\_1行_」）だけを抜き出す場合は、以下のようなコードとなります。
```console.log(`1件目の会社名は、${resp.records[0]['文字列__1行_'].value}です。`);```

また、今回のデータ抽出に関しての条件は以下の部分で指定しています。
```let query = `Address like "栃木県"`;```
これは、**Address**フィールドに、**栃木県**という文字が含まれているかどうかを表しています。
**like**以外にも、以下のような比較演算子が使えます。

|比較演算子|意味|
|:--|:--|
|=|完全一致|
|!=|完全一致の否定|
|>|より大きい|
|<|より小さい|
|>=|以上|
|<=|以下|
|in|いずれかと一致。例：Field in ("A", "B")|
|not in|いずれでもない|
|like|が含まれる|
|not like|が含まれない|
|or|複数の比較の和。例:Field = "A" or Field = "B"|
|and|複数の比較の積。例:Field = "A" and Name = "Tanaka"|


### kintoneデータの追加

ここからは、Functions内に記載するコードのみで説明をします。
kintoneのデータを追加するには、たとえば次のようなコードを使います。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);
    
    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);
    
    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください

    // 追加したいデータを定義
    let recordData = {
        "文字列__1行_": {   // 会社名
            value: "KDDIウェブコミュニケーションズ"
        },
        "文字列__1行__2": {   // 担当者名
            value: "高橋克己"
        },
        "TEL": {   // 電話番号
            value: "090-1234-5678"
        },
    };

    kintoneRecord.addRecord(appID, recordData)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

フィールドコードを省略した場合、そのフィールドの初期値で値が自動的に生成されます。
また、間違ったフィールドコードを指定した場合、そのフィールドは無視されます。

実行結果は以下のようになります。
<img width="618" alt="スクリーンショット 2018-08-17 17.07.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/10ac71eb-8088-0ea6-e9dd-585e8e3cfd1a.png">

addRedordを実行すると、追加されたレコード番号（id）を取得することができます（addRecordの戻り値であるresp.id）。

同時に複数のレコードを追加するには、addRecordの代わりにaddRecordsを利用します。addRecordとの違いは、２番めの引数に配列を使用する点です。
例えば以下のようなコードとなります。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);
    
    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);
    
    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください

    // 追加したいデータを定義
    let recordData = [
        {
            "文字列__1行_": {   // 会社名
                value: "会社名A"
            },
            "文字列__1行__2": {   // 担当者名
                value: "〇〇〇〇"
            },
            "TEL": {   // 電話番号
                value: "090-1234-5678"
            },
        },
        {
            "文字列__1行_": {   // 会社名
                value: "会社名B"
            },
            "文字列__1行__2": {   // 担当者名
                value: "△△△△"
            },
            "TEL": {   // 電話番号
                value: "090-1234-5678"
            },
        },
    ];

    kintoneRecord.addRecords(appID, recordData)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

addRedordsを実行すると、追加されたレコード番号（id）を配列として取得することができます（addRecordsの戻り値であるresp.ids）。

### kintoneデータの更新

データの更新は3種類の方法があります。

- レコードIDを使った単一レコード更新
- アップデートキーを使った単一レコード更新
- 複数レコードの同時更新

#### レコードIDを使った単一レコード更新

最もシンプルな更新方法です。更新したいレコードIDと更新したいフィールドの内容を指定して更新することができます。
例えば、電話番号だけを更新したい場合は、以下のようなコードとなります。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);

    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);

    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください
    let recordID = 7; // 更新したいレコードのID

    // 更新したいデータを定義
    let recordData = {
        "TEL": {   // 電話番号
            value: "090-9999-9999"
        },
    };

    kintoneRecord.updateRecordById(appID, recordID, recordData)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

更新が正常に完了すると、更新後のリビジョン番号（revision）が戻ります。

![スクリーンショット 2019-01-21 10.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/86046/041d7725-b866-b3b2-916b-8be3e96b6ac7.png)

なお、更新作業がコンフリクトしないようにする（排他制御）には、次のようにupdateRecordByIdの引数に更新したいリビジョン番号を追加することができます。

`updateRecordById(appID, recordID, recordData, revision)`

更新したいリビジョンデータが他のユーザなどによって更新されてしまっている場合はエラーが戻ります。

#### アップデートキーを使った単一レコード更新

アプリ内に、レコードID以外にユニークになるフィールドがある場合は、そちらを使って更新することもできます。
ユニークになるフィールドは、「文字列（1行）」か「数字」で、**値の重複を禁止する**にチェックが入っている必要があります。

![スクリーンショット 2019-01-21 11.21.47.png](https://qiita-image-store.s3.amazonaws.com/0/86046/38610071-8221-fbc1-d13f-4aa915d14408.png)

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);

    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);

    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください
    
    // 更新したいレコードをユニークで特定できるキーと値
    let updateKey = {
        field: "TEL",
        value: "090-9999-9999"
    };

    // 更新したいデータを定義
    let recordData = {
        "文字列__1行__2": {   // 担当者名
            value: "山田太郎"
        },
    };

    kintoneRecord.updateRecordByUpdateKey(appID, updateKey, recordData)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

なお、上記コードはTELフィールドをアップデートキーにしていますが、顧客リストアプリではTELフィールドは値の重複を禁止していないため、このままではエラーになります。また、アップデートキーに指定したフィールド自体を更新することはできません。
排他制御を実装するために、リビジョン番号を引数に指定することもできます。

`updateRecordByUpdateKey(appID, updateKey, recordData, revision)`

#### 複数レコードの同時更新
 
同時に複数のレコードを更新するためには、updateRecordsを利用することができます。
たとえば、レコード番号25と26のデータに対して、電話番号を「090-1234-5678」に書き換えるためには、以下のようにコーディングすることができます。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);

    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);

    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください

    // 更新したいデータを定義
    let recordData = {
        "TEL": {   // 電話番号
            value: "090-1234-5678"
        },
    };
    
    // 更新対象データの定義
    let recordsDataUpdate = [
        {
            id: 25,
            record: recordData
        },
        {
            id: 26,
            record: recordData
        },
    ];

    kintoneRecord.updateRecords(appID, recordsDataUpdate)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

この例では、更新対象データをレコードIDで指定しましたが、アップデートキーを使って指定することもできます。

```javascript
let recordsDataUpdate = [
    {
        updateKey: {
            field: '{your_field_code}',
            value: '{your_field_code_value}'
        },
        record: {
            '{your_field_code}': '{your_field_code_value}'
        },
    },
    {
        updateKey: {
            field: '{your_field_code}',
            value: '{your_field_code_value}'
        },
        record: {
            '{your_field_code}': '{your_field_code_value}'
        },
    },
};
```

排他制御を行う場合は、リビジョン番号を指定することもできます。

```javascript
let recordsDataUpdate = [
    {
        updateKey: {
            field: '{your_field_code}',
            value: '{your_field_code_value}'
        },
        record: {
            '{your_field_code}': '{your_field_code_value}'
        },
        revision: {record_revision_number}
    },
};
```

### kintoneデータの削除

データの削除方法としては、以下の2種類があります。

- 複数のレコードIDを指定して削除する
- リビジョン番号を指定していて複数レコードを削除する

#### 複数のレコードIDを指定して削除する

特定のレコードIDを配列にして削除する方法となります。単一レコードを削除する場合もこちらをご利用ください。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);

    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);

    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください
    let recordIDs = [25, 26]; // 削除したいレコードのIDの配列

    kintoneRecord.deleteRecords(appID, recordIDs)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

#### レコードIDとリビジョン番号を指定して複数レコードを削除する

削除にも排他処理を実装したい場合は、以下のようにリビジョン番号とIDとペアで指定することができます。
この例では、レコードIDが27と28で、それぞれリビジョン番号が１のものを削除します。

```javascript
const kintone = require('kintone-nodejs-sdk');

exports.handler = function(context, event, callback) {
    // kintone認証設定（API KEY）
    let kintoneAuth = new kintone.Auth();
    kintoneAuth.setApiToken(context.KINTONE_API_TOKEN);

    // コネクション作成
    let kintoneConnection = new kintone.Connection(context.KINTONE_APP_URI, kintoneAuth);    

    // レコード作成
    let kintoneRecord = new kintone.Record(kintoneConnection);

    let appID = 1; // アプリID　※ここの値は皆さんの環境に合わせて変更してください
    let idsWithRevision = {
        27: 1,
        28: 1,
    };  // 削除したいIDとリビジョン番号を列挙
    
    kintoneRecord.deleteRecordsWithRevision(appID, idsWithRevision)
    .then((resp) => {
        Object.keys(resp).forEach(function(key) {
            console.log(key, resp[key]);
        });
        callback(null, 'OK');
    })
    .catch((err) => {
        const error = err.get();
        Object.keys(error).forEach(function(key) {
            console.log(key, error[key]);
        });
        callback(error.message);
    });
};
```

# まとめ

以上が基本的なkintoneアクセスの方法となります。
これ以外にも、テーブルの操作やコメントの操作などもあるので、これらについては追って記事を書きたいと思います。

---
### Twilio（トゥイリオ）とは

https://twilio.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。