🥤

i-ReporterのAPIをGoogleAppsScript(GAS)からリクエストしてみた

2023/05/26に公開

みなさんこんにちわ。
自称アイレポエバンジェリストのmnrです。
ユーザー会でいつもお世話になっています。

さてアイレポのWebAPIをGoogleAppsScript(以下GAS)から利用する方法について書いてみたいと思います。

アイレポのWebAPIを使うと自動帳票作成や各種データーの取り込みなどが普段使っているグループウェアなどから出来るようになりますのでアイレポの標準機能で実現出来なかったかゆいところに手が届く存在になりますのでぜひ試して頂きたいと思います。

では、出来る限り短い文章で説明したいと思います。

🦄 まずはGASの準備をします

それでは具体的にGASからアイレポのWebAPIを利用する方法を説明していきましょう。
まずGoogleSpreadSheet上で拡張機能▶AppsScriptを押します。

以下のような画面になります。
※エディタに適当な名前をつけています。

これだけで準備完了です。

🦄 アイレポのWebAPIの確認をします

ではサポートWEBから外部連携APIの項目の外部連携 Web API I/F仕様書をクリックしてAPIの仕様を確認してみましょう。


https://cimtops-support.com/i-Reporter/ja/manual-jp/developer-manual-jp

仕様書を見るとログインを行い同一のセッション内で任意のAPIをリクエストし最後はログアウトが基本であることが確認できます。

🦄 クラスター値取得API

今回はシンプルなAPIの「クラスター値取得API」を使用してアイレポのapiの使用感を掴むことを目的としたいと思います。
クラスター値取得APIはGetClusterValueというcommandでリクエストしreport または systemKeyで帳票を一意に特定してクラスターの値を取るということがわかりました。

🦄 以下の帳票のクラスターの値を取ります。

工事名がトイレ工事と記載されているクラスターの値を取りたいと思います。
クラスターのインデックスは3です。今回は帳票のID(report)を特定しクラスターの値を取得します。

Managerから定義のクラスターの値を確認しています。

"report": "12345", // 取得する帳票のID
"sheetNo": "1", // 取得する帳票のシートのページ番号
"clusterSearchMode": "index",
"clusterSearchValue": "3", // 取得する帳票のクラスターインデックス

🦄 以下のコードを流し込めば終了

コードエディタで元々あったmyFunction関数を消去し以下のコードを流し込みます。

 /*
APIエンドポイント
【オンプレミス版】
http://<サーバーのIPアドレス>/Rests/APIExecute.aspx

※SSLを使う場合
https://<ホスト名>/Rests/APIExecute.aspx

【クラウド版】
https://<ホスト名>/ConMasAPIXXXXXX/Rests/APIExecute.aspx
*/
/**
 * Global variables
 */
var url = "APIエンドポイント";
var cookie = "";


/**
 * Main function
 */
function main() {
  // セッションがない(クッキー)場合ログインを行う
  if (!cookie) {
    login();
  }

  // 各APIの呼び出し
  getClusterValue();

  // 同一セッション処理 ログアウトまで好きなapiをリクエストする
  logout();
}

/**
 * Login to the API
 */
function login() {
  var headers = {
    "Content-Type": "application/x-www-form-urlencoded",
  };

  var data = {
    "command": "Login",
    "user": "conmasadmin", // リクエストするユーザーに変更。セキュリティ的にプロパティにセットすることを推奨します。
    "password": "パスワード",
  };
  var options = {
    "method": "POST",
    "headers": headers,
    "payload": data,
  };

  var response = UrlFetchApp.fetch(url, options);
  var responseHeaders = response.getAllHeaders(); // レスポンスヘッダーを取得
  var resCookie = responseHeaders["Set-Cookie"]; // Set-CookieヘッダーからCookieを取得

  console.log("Response: " + response.getContentText());
  //グローバルのcookieに代入
  cookie = resCookie;
}

/**
 * Logout from the API
 */
function logout() {
  var headers = {
    "Content-Type": "application/x-www-form-urlencoded",
    "Cookie": cookie,
  };

  var data = {
    "command": "Logout",
  };
  var options = {
    "method": "POST",
    "headers": headers,
    "payload": data,
  };

  var response = UrlFetchApp.fetch(url, options);
  console.log("logoutResponse: " + response.getContentText());
}

/**
 * Get cluster value from the API
 */
function getClusterValue() {
  var headers = {
    "Content-Type": "application/x-www-form-urlencoded",
    "Cookie": cookie,
  };

  var data = {
    "command": "GetClusterValue",
    "report": "12345", // 取得する帳票のID
    "sheetNo": "1", // 取得する帳票のシートのページ番号
    "clusterSearchMode": "index",
    "clusterSearchValue": "3", // 取得する帳票のクラスターインデックス
  };
  var options = {
    "method": "POST",
    "headers": headers,
    "payload": data,
  };

  var response = UrlFetchApp.fetch(url, options);
  console.log("Response: " + response.getContentText());
}


エディタに貼り付け

main関数を選択し再生ボタンで実行します。

実行すると。承認を求めてきます。

実行すると。承認を求めてきます。「許可」します。

以下のようになっていたら成功です。
トイレ工事という値が取れていますね。

GASのコード上では直接console.logをしているだけですが値をreturn してあげればGoogleSpreadsheet上やプログラムから使えるようになります。

今回のこのコードのポイントはlogin()関数上でresponseHeaders["Set-Cookie"]でクッキーの値を取得して値を保持し

login()関数内
  var resCookie = responseHeaders["Set-Cookie"]; // Set-CookieヘッダーからCookieを取得

  console.log("Response: " + response.getContentText());
  cookie =  resCookie;

getClusterValue関数呼び出す際に以下のように利用することで同一セッションを実現しています。

getClusterValue()関数内
    var headers = {
    "Content-Type": "application/x-www-form-urlencoded",
    "Cookie":cookie
  };

main()関数ではログインとログアウトの間に各APIの呼び出しをおこなっています。

main()関数
function main(){
  //セッションがない(クッキー)場合ログインを行う
  if(!cookie){
    login()
  }

  //各APIの呼び出し
  getClusterValue();
  //同一セッション処理 ログアウトまで好きなapiをリクエストする

  logout();
}

今回はGASから簡単なAPIをリクエストしただけですが基本的に全てのアイレポのWebAPIをリクエストする事が可能です。例えばGmailでメールを受け取り帳票を作成することなども簡単に実現しますのでぜひやってみてください。

夢が広がりますね。間違いなく会社でヒーローになれると思います。
では今日のところはここまでです。

ではレッツ愛レポWebAPI!

おまけ

帳票ファイル取得APIを使用して帳票をGoogleドライブに保存してみる

まずはマニュアルの確認です。

GetReportFileというコマンドとfileTypeとreportが必須のようです。


function main(){
  //セッションがない(クッキー)場合ログインを行う
  if(!cookie){
    login()
  }

  //各APIの呼び出し
  getReportFile();
  //同一セッション処理 ログアウトまで好きなapiをリクエストする

  logout();
}

function getReportFile() {
  var headers = {
    "Content-Type": "application/x-www-form-urlencoded",
    "Cookie": cookie
  };

  var data = {
    "command": "GetReportFile",
    "fileType": "pdf",
    "report": "9999999", //帳票IDに変えてください。
  };
  var options = {
    "method": "POST",
    "headers": headers,
    "payload": data
  };

  var response = UrlFetchApp.fetch(url, options);
  // レスポンスをBlobに変換
  var blob = response.getBlob().setContentType('application/pdf'); 

  // BlobをGoogleドライブに保存 フォルダidを指定
  var folder = DriveApp.getFolderById("hogehogehogehogehogehogehogehoge"); // 保存先フォルダを指定
  var fileName = "report_" + data.report + ".pdf"; // 保存するファイル名を設定
  var file = folder.createFile(blob).setName(fileName); // Blobをファイルとして保存

  console.log("Saved file: " + file.getUrl());
}

DriveApp.getFolderById("hogehogehogehogehogehogehogehoge");
で指定したフォルダにちゃんとアップロードさられています!

各APIドキュメントの確認先

サポートWEBのシステム連携マニュアルページ

https://cimtops-support.com/i-Reporter/ja/manual-jp/developer-manual-jp

GASの UrlFetchApp.fetch関数のマニュアル

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=ja

Discussion