QualityForward GAS SDKとCustomers Mail Cloud SDKで一日の作業件数を集計、メールする

[QualityForward](http://bit.ly/2tNIqIk)はクラウドベースのテスト管理サービスです。Web APIを提供しています。そのWeb APIを使いやすくするため、Google Apps Script SDKを開発中です。

今回はそんなQualityForward GAS SDKで集計した結果をCustomers Mail Cloudを使ってメール送信してみます。

## Customers Mail Cloudについて

[Customers Mail Cloud](https://smtps.jp/)はメール送信のクラウドサービスです。Web APIがあるので、SMTP接続できない環境でもメール送信ができます。Googleスプレッドシートについても同様に、Google Apps Scriptからメール送信できます。Customers Mail CloudについてもGoogle Apps Script用のライブラリがあります（非公式です）。

## 準備

まずはライブラリを読み込みます。QualityForwardのプロジェクトIDは `1ppRPLjuClG0MhtnXYbskdZ8uYGbyCFHv7MFhr0GYa-3IAKEh8B7lmTMb` 、 Customers Mail Cloudのライブラリは `1RegQzjZLiJUacopzEoxmpTe5_vp7LP3r01aa-D9rf4sJRPZkifI4Mf7K` になります。これを取り込みます。

<img width="1374" alt="Screenshot_ 2019-12-25 0.00.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/68731ccd-a36d-1b40-cece-32a12839217f.png">


## 初期化

APIキーはスプレッドシート側（Dataというシート）に記述してあります。

```js
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data")
var apiKey = sheet.getRange(1, 2).getValue();
var qf = new QualityForward.Client(apiKey);
```

## 必要な変数の準備

まず今日の作業分を集計するので、必要な変数と当てはまるテストケースを格納する変数を用意します。

```js
var ary = []; // 今日の結果を入れる
var today = new Date;
```

## テストフェーズの取得

最初にテストフェーズをすべて取得します。

```js
var testPhases = qf.getTestPhases();
```

次にすべてのテストフェーズについて、テストケースを取得します。

```js
for (var i in testPhases) {
  for (var j in testPhases[i].test_suite_assignments) {
    var testSuiteAssignment = testPhases[i].test_suite_assignments[j];
    var testCycles = testSuiteAssignment.getTestCycles();
    // : 次の処理はこの中に記述
  }
}
```

## テスト結果の取得

すべてのテストサイクルについて、テスト結果を取得します。テスト結果の中で本日作業分をフィルタリングします。

```js
for (var k in testCycles) {
  var testCycle = testCycles[k];
  var results = testCycle.getTestResults();
  for (var l in results) {
    var testResult = results[l];
    var d = testResult.executed_at;
    if (d.getFullYear() === today.getFullYear() && 
      d.getMonth() === today.getMonth() &&
      d.getDate() === today.getDate()) {
      ary.push(testResult);
    }
  }
}
```

## テスト結果ごとにグルーピングする

TestResultが取得できたら、テスト結果ごとにグルーピングします。

```js
var group = {};
for (var key in ary) {
  var testResult = ary[key];
  if (!group[testResult.result]) group[testResult.result] = 0;
  group[testResult.result]++;
}
```

## Customers Mail Cloudの初期化

続いてメール送信の準備をします。まずCustomers Mail Cloud SDKの初期化です。こちらもスプレッドシート内にキーを記述しています。

```js
var cmcApiUser = sheet.getRange(2, 2).getValue();
var cmcApiKey = sheet.getRange(3, 2).getValue();
var c = new CustomersMailCloud.Client(cmcApiUser, cmcApiKey);
```

Web APIのエンドポイントは契約によって異なるので指定します。今回は無料トライアルを指定します。

```js
c.trial(); // 無料トライアルの場合
```

## Fromの指定

メールの送信元を指定します。名前とメールアドレスを指定しますが、これもスプレッドシート内で定義しています。

```js
var fromName = sheet.getRange(4, 2).getValue();
var fromAddress = sheet.getRange(5, 2).getValue();
c.setFrom(fromName, fromAddress);
```

## Toの指定

メールの送信先を指定します。名前とメールアドレスを指定しますが、これもスプレッドシート内で定義しています。

```js
var toName = sheet.getRange(6, 2).getValue();
var toAddress = sheet.getRange(7, 2).getValue();
c.addTo(toName, toAddress);
```

## 件名の指定

メールの件名を指定します。これもスプレッドシート内で定義しています。

```js
c.subject = sheet.getRange(8, 2).getValue();
```

## 本文の指定

本文はコードの中で作成しています。例えば次のようになります。

```js
c.text = [
  today.getFullYear() + '年' + (today.getMonth() + 1) + '月' + today.getDate() + '日のテスト結果です',
  '',
  '完了　 ：' + (group.pass || 0) + '件',
  '不可　 ：' + (group.fail || 0) + '件',
  'スキップ：' + (group.skip || 0) + '件',
  'カット　 ：' + (group.cut || 0) + '件',
  'ブロック ：' + (group.block || 0) + '件',
  'N/A　  ：' + (group.na || 0) + '件',
  'Q&A　  ：' + (group.qa || 0) + '件'
].join("\n");
```

## 送信する

結果を送信します。

```js
try {
  var res = c.send();
  Logger.log(res);
} catch (e) {
  Logger.log(e);
}
```

無事メールでテスト結果の集計が届けば完了です。

<img width="477" alt="Screenshot_ 2019-12-25 0.14.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6e828ec1-2d88-3b54-27a0-c4fea49639b8.png">


## まとめ

後はこの関数をGASのトリガーで時間実行（1日ごとなど）にすれば、集計結果を毎日メールしてくれるようになります。QualityForwardにはメール配信機能はありませんが、Google Apps Script SDKとCustomers Mail Cloudを組み合わせることで、簡単にメール送信が実現できます。ぜひお試しください。

[QualityForward](http://bit.ly/2tNIqIk)