MantisデータをGoogle Sheetsで日本語リアルタイム検索 (GAS & Selenium活用記)

## はじめに

この記事は、以前作成した[Mantisリアルタイム通知システム](https://qiita.com/HNGSNGGN/items/359431afd8d5a67e692f)に続き、QAチームからの追加要望に応える形で進めたプロジェクトの記録です。
> 「Mantisのイシューを日本語で検索したいのですが、可能ですか？」

Mantisのイシューはすべて韓国語で登録されており、日本のチームメンバーはキーワード検索に大きな困難を抱えていました。この問題を解決するため、私は既存のOracle Cloud VM環境を再利用し、Google Sheetsをデータベースとして活用した日本語検索システムの構築に挑戦しました。

## 1. 課題定義：言語の壁を越える検索システム

-   **ユーザーの要望**: Mantisの課題データを日本語のキーワードで検索したい。
-   **技術的課題**:
    1.  Mantisの全データをどのようにして外部のGoogle Sheetsに転送するか？
    2.  以前のプロジェクトで利用したRSSフィードは、課題の「ステータス」や「ターゲットバージョン」といった詳細情報が含まれておらず、全データ取得には不適切だった。
---

### **▼ 完成したシステムの動作デモ**
このプロジェクトで最終的に完成した、Google Sheets上で日本語キーワード検索が可能なシステムの動作デモがこちらです。

[**📹 Mantis日本語検索システムの動作デモ (動画サンプル)**](https://github.com/HNGSNGGN/mantis-automation-suite/raw/main/demo.mp4)

---
## 2. 技術的挑戦と解決策：Seleniumとの出会い

-   **アイデア**: サーバー内部で直接ブラウザを操作してデータを取得し、その結果を外部に送信してはどうか？
-   **発見**: このアイデアを具体化する過程で、私はSeleniumというツールに初めて出会いました。コードでWebブラウザの動作を自動化できるSeleniumは、この課題の完璧な解決策でした。
-   **解決戦略**: Mantisには課題リスト全体をCSVファイルとしてエクスポートする機能(`csv_export.php`)がありました。VM上でSeleniumを使ってMantisにログインし、このページにアクセスすれば、全データをクリーンな形で抽出できると確信しました。

## 3. システムアーキテクチャ設計：Python → Gmail → Google Apps Script

ファイアウォールの内側にあるMantisから、外部のGoogle Sheetsへデータを送るため、私は3つの技術をパイプラインのように連結する、少しユニークなアーキテクチャを設計しました。

1.  **Python (in Oracle VM)**: `mantis_csv_mailer.py`スクリプトを15分ごとに実行
    -   SeleniumでMantisにログインし、セッションクッキーを取得します。
    -   このクッキーを`requests`ライブラリに引き継ぎ、`csv_export.php`から全課題データをCSV形式でダウンロードします。
    -   取得したCSVデータをGmailに添付ファイルとして送信。Eメールをデータ転送パイプラインとして活用しました。
    ```python
    # CSVダウンロードと保存
    csv_url = f"{MANTIS_HOST}/csv_export.php"
    response = requests.get(csv_url, cookies=cookies)
    
    # ... (ファイル保存とメール添付処理) ...
    ```

2.  **Gmail**: データの中継地点
    -   Pythonスクリプトが送信したメールを受信し、GASが安全にアクセスできる中間ストレージの役割を果たします。

3.  **Google Apps Script (in Google Sheets)**: 15分ごとにトリガー実行
    -   `GmailApp.search()`で特定の件名のメールを検索し、添付されたCSVファイルを取得します。
    -   `Utilities.parseCsv()`でCSVの内容を2次元配列にパースします。
    -   `sheet.setValues()`で既存のシート内容をクリアし、新しいデータで全件更新。常に最新の状態を保ちます。
    ```javascript
    // GASによる添付ファイルのパース処理
    function updateMantisFromAttachment() {
      const threads = GmailApp.search('subject:(MANTIS CSV) has:attachment', 0, 1);
      if (threads.length === 0) return;

      const attachments = threads[0].getMessages()[0].getAttachments();
      const csvAttachment = attachments.find(att => att.getName().endsWith('.csv'));
      
      if (csvAttachment) {
        const csvContent = csvAttachment.getDataAsString("utf-8");
        const rows = Utilities.parseCsv(csvContent);
        sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
      }
    }
    ```

## 4. 完成したシステム：QAチームのためのリアルタイム日本語検索エンジン

このシステムのおかげで、QAチームは翻訳機に頼ることなく、使い慣れたGoogle Sheetsの環境で直接日本語で課題を検索・管理できるようになりました。`FILTER`関数と`GOOGLETRANSLATE`関数を組み合わせたインタラクティブな検索機能は、期待以上の評価を得ることができました。

## おわりに：一つの経験が、次なる革新へ

このプロジェクトで初めてSeleniumを扱った経験は、私にWebベースのシステムを自動化する強力な武器を与えてくれました。

そして、この経験はすぐに過去のプロジェクトの心残りを解決するアイデアへと繋がりました。
> Seleniumでログインできるなら、以前RSSでは不可能だった最新コメントの取得もできるはずだ！

この気づきを基に、以前の通知システムをどのように高度化させたのか、その詳細は以下の記事でご覧いただけます。

> **➡️ 以前のプロジェクトの改善記録:** [Mantisの最新コメントを、見逃さずにSlackへ！(RSS, Selenium, AWS活用記)](https://qiita.com/HNGSNGGN/items/359431afd8d5a67e692f)

一つの課題を深く掘り下げて解決した経験が、連鎖的に次の革新を生み出す過程を実体験できた、貴重なプロジェクトでした。

---

### **GitHub Code**

> **[mantis_csv_mailer.py](https://github.com/HNGSNGGN/mantis-automation-suite/blob/main/mantis_csv_mailer.py)**
>
> **[gsheet_importer.js](https://github.com/HNGSNGGN/mantis-automation-suite/blob/main/gsheet_importer.js)**
>
> *(全ての機密情報は`.env`ファイルで分離し、安全に管理しています。)*