製品をチェック

製品の詳細・30日間の無償トライアルはこちら

CData Connect

Google Apps Script(GAS)からHubDB データに連携

CData Connect Server を使用してGoogle Apps Script からHubDB データを操作します。

宮本航太
プロダクトスペシャリスト

最終更新日:2022-11-14

こんにちは!プロダクトスペシャリストの宮本です。

Google Apps Script(GAS)を使用すると、Google スプレッドシートやGoogle Docs(Google ドキュメント)を含むGoogle アプリ内でカスタム機能を作成できます。CData Connect Server を使用すると、HubDB を含むCData でサポートされている240を超えるデータソースにアクセスできます。Google Apps Script のネイティブサポートに対応したJDBC 機能を使って、Google スプレッドシート・Docs からリアルタイムHubDB データにアクセスしてみましょう。

この記事では、Connect Server でHubDB に接続する方法を説明して、Google スプレッドシートでHubDB データを処理するためのサンプルスクリプトを提供します。

ホスティングについて

GAS からCData Connect Server に接続するには、利用するConnect Server インスタンスをネットワーク経由での接続が可能なサーバーにホスティングして、URL での接続を設定する必要があります。CData Connect がローカルでホスティングされており、localhost アドレス(localhost:8080 など)またはローカルネットワークのIP アドレス(192.168.1.x など)からしか接続できない場合、GAS はCData Connect Server に接続することができません。

クラウドホスティングでの利用をご希望の方は、AWS MarketplaceGCP Marketplace で設定済みのインスタンスを提供しています。


こちらのスクリプトは指定されたテーブルからデータを読み取るだけですが、スクリプトを簡単に拡張して更新機能を組み込むことができます。

HubDB データの仮想データベースを作成する

CData Connect Server は、シンプルなポイントアンドクリックインターフェースを使用してデータソースに接続し、データを取得します。まずは、右側のサイドバーのリンクからConnect Server をインストールしてください。

  1. Connect Server にログインし、「CONNECTIONS」をクリックします。 データベースを追加
  2. 一覧から「HubDB」を選択します。
  3. HubDB に接続するために必要な認証プロパティを入力します。

    HubDBデータソースへの接続には、パブリックHubSpotアプリケーションを使用したOAuth認証とプライベートアプリケーショントークンを使用した認証の2つの方法があります。

    カスタムOAuthアプリを使用する

    すべてのOAuthフローでAuthSchemeを"OAuth"に設定する必要があります。特定の認証ニーズ(デスクトップアプリケーション、Webアプリケーション、ヘッドレスマシン)に必要な接続プロパティについては、ヘルプドキュメントを確認してください。

    アプリケーションを登録し、OAuthクライアント認証情報を取得するには、以下の手順を実行してください。

    1. HubSpotアプリ開発者アカウントにログインします。
      • アプリ開発者アカウントである必要があります。標準のHubSpotアカウントではパブリックアプリを作成できません。
    2. 開発者アカウントのホームページで、アプリタブをクリックします。
    3. アプリを作成をクリックします。
    4. アプリ情報タブで、ユーザーが接続する際に表示される値を入力し、必要に応じて変更します。これらの値には、パブリックアプリケーション名、アプリケーションロゴ、アプリケーションの説明が含まれます。
    5. 認証タブで、「リダイレクトURL」ボックスにコールバックURLを入力します。
      • デスクトップアプリケーションを作成する場合は、http://localhost:33333のようなローカルにアクセス可能なURLに設定します。
      • Webアプリケーションを作成する場合は、ユーザーがアプリケーションを承認した際にリダイレクトされる信頼できるURLに設定します。
    6. アプリを作成をクリックします。HubSpotがアプリケーションとそれに関連する認証情報を生成します。
    7. 認証タブで、クライアントIDクライアントシークレットを確認します。これらは後でドライバーを設定する際に使用します。
    8. スコープの下で、アプリケーションの意図する機能に必要なスコープを選択します。

      テーブルにアクセスするには、最低限以下のスコープが必要です:

      • hubdb
      • oauth
      • crm.objects.owners.read
    9. 変更を保存をクリックします。
    10. 統合に必要な機能にアクセスできる本番ポータルにアプリケーションをインストールします。
      • 「インストールURL(OAuth)」の下で、完全なURLをコピーをクリックして、アプリケーションのインストールURLをコピーします。
      • コピーしたリンクをブラウザで開きます。アプリケーションをインストールする標準アカウントを選択します。
      • アプリを接続をクリックします。結果のタブは閉じて構いません。

    プライベートアプリを使用する

    HubSpotプライベートアプリケーショントークンを使用して接続するには、AuthSchemeプロパティを"PrivateApp"に設定します。

    以下の手順に従ってプライベートアプリケーショントークンを生成できます:

    1. HubDBアカウントで、メインナビゲーションバーの設定アイコン(歯車)をクリックします。
    2. 左サイドバーメニューで、統合 > プライベートアプリに移動します。
    3. プライベートアプリを作成をクリックします。
    4. 基本情報タブで、アプリケーションの詳細(名前、ロゴ、説明)を設定します。
    5. スコープタブで、プライベートアプリケーションがアクセスできるようにしたい各スコープに対して読み取りまたは書き込みを選択します。
    6. テーブルにアクセスするには、最低限hubdbとcrm.objects.owners.readが必要です。
    7. アプリケーションの設定が完了したら、右上のアプリを作成をクリックします。
    8. アプリケーションのアクセストークンに関する情報を確認し、作成を続行をクリックし、その後トークンを表示をクリックします。
    9. コピーをクリックして、プライベートアプリケーショントークンをコピーします。

    接続するには、PrivateAppTokenを取得したプライベートアプリケーショントークンに設定します。

    コネクションを設定(Salesforce の場合)。
  4. Test Connection」をクリックします。
  5. 「Permission」->「 Add」とクリックし、適切な権限を持つ新しいユーザー(または既存のユーザー) を追加します。

仮想データベースが作成されたら、Google Apps Script を含むお好みのクライアントからHubDB に接続できるようになります。

Apps Script を使ってHubDB データに接続

この時点で、Connect Server でHubDB の仮想データベースが構成できました。あとは、Google Apps Script を使ってConnect Server にアクセスし、Google スプレッドシートでサービスを操作するだけです。

CData Connect Server のTDS エンドポイントを確認

まずは、接続に必要なTDS エンドポイントの情報を取得しておきます。「CLIENTS」→「View Endpoints」とクリックすると表示される、「SQL Server Hostname」と「Port」の情報が必要になります。

SQL Server のエンドポイント情報を表示

次に、スプレッドシートにHubDB データを入力するためのスクリプト(スクリプトを呼び出すメニューオプション付き)を作成します。サンプルスクリプトを作成し、以下で各部分について説明を加えています。スクリプトの全体については、記事の最後に記載しています。

1.空のスクリプトを作成

Google スプレッドシートのスクリプトを作成するには、Google スプレッドシートメニューから「拡張機能」→「Apps Script」をクリックします。

Google スプレッドシートのメニューからApps Script へ移動

2.クラス変数を宣言

スクリプトで作成された関数で使用できるようにいくつかのクラス変数を作成します。

  //CData Connect ServerのIP およびポートを指定
  var connectionName = 'xxxxxxx:1433;';
  //CData Connect Serverで作成したユーザー
  var user = 'admin';
  //CData Connect Serverで設定したパスワード
  var userPwd = 'xxxxxx';
  //接続先DB名(CData Connect Serverのコネクション名)
  var db = 'Connect_1';
   
  var instanceUrl = 'jdbc:sqlserver://' + connectionName + 'databaseName=' + db;

3.メニューオプションを追加

この関数は、Google スプレッドシートにメニューオプションを追加し、UI を使用して関数を呼び出すことができるようにします。

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
  {name:'データをスプレッドシートに書き込む', functionName: 'selectHubDBData'}
  ];
  spreadsheet.addMenu('HubDB データを取得', menuItems);
}
作成する関数実行用のメニュー

4.HubDB データをスプレッドシートに書き込む関数を記述

以下の関数では、Google Apps Script のJDBC 機能を使用してHubDB をConnect Server に接続し、SELECT でデータを取得してスプレッドシートに入力します。スクリプトを実行すると、以下の2つの入力ボックスが表示されます。

最初のボックスは、データを保持するシート名を入力するためのものです(該当するシートがない場合、新規に作成されます)。

シート選択用の入力ボックス。

次のボックス、読み込むHubDB テーブルの名前を入力するためのものです。無効なテーブルを選択するとエラーメッセージが表示され、関数が終了します。

テーブル選択用の入力ボックス。

この関数は、メニューオプションからの使用を想定して設計されていますが、スプレッドシートの式として使用するようにカスタマイズすることもできます。

/*
 * 指定したHubDB のテーブルからデータを読み込み、指定したシートに書き込みます。
 *  シートが存在しない場合、新規に作成されます。
 */
function selectHubDBData() {
  var thisWorkbook = SpreadsheetApp.getActive();

  //select a sheet and create it if it does not exist
  var selectedSheet = Browser.inputBox('データを書き込みたいシートを指定してください',Browser.Buttons.OK_CANCEL);
  if (selectedSheet == 'cancel')
    return;

  if (thisWorkbook.getSheetByName(selectedSheet) == null)
    thisWorkbook.insertSheet(selectedSheet);
  var resultSheet = thisWorkbook.getSheetByName(selectedSheet);
  var rowNum = 2;

  //select a HubDB 'table'
  var table = Browser.inputBox('データを取得したいテーブルを指定してください',Browser.Buttons.OK_CANCEL);
  if (table == 'cancel')
    return;

  // JDBCでデータベースへのコネクション確立
  var conn = Jdbc.getConnection(instanceUrl , user, userPwd);
  var stmt = conn.createStatement();

  //入力したテーブルが利用可能か検証します
  var dbMetaData = conn.getMetaData();
  var tableSet = dbMetaData.getTables(null, null, table, null);
  var validTable = false;
  while (tableSet.next()) {
    var tempTable = tableSet.getString(3);
    if (table.toUpperCase() == tempTable.toUpperCase()){
      table = tempTable;
      validTable = true;
      break;
    }
  } 
  tableSet.close();
  if (!validTable) {
    Browser.msgBox("テーブル名が不正です:" + table, Browser.Buttons.OK);
    return;
  }

   
  // 実行したいSQL
  var results = stmt.executeQuery('SELECT * FROM [Connect_1].[Account];');
   
  var numCols = results.getMetaData();
   
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
   
  let i = 1;
  while (results.next()) {
   
    var clmString = '';
    for (var col = 0; col < numCols.getColumnCount(); col++) {
        if (col==0){
          for(var j=1; j<=numCols.getColumnCount(); j++) {
            sheet.getRange(1, j).setValue(numCols.getColumnName(j))
          }
        }
    
      clmString = results.getString(col + 1);
      Logger.log(clmString);
      sheet.getRange(i+1, col+1).setValue(clmString);
    }
    i++;
  }
   
  results.close();
  stmt.close(); 
}
  

処理が完了するとHubDB データが入力されたスプレッドシートが作成され、インターネットにアクセスできるあらゆる場所でGoogle スプレッドシートの計算、グラフ化、チャート作成機能を利用できるようになります。


Google Apps Script 用サンプルスクリプトの全体


//CData Connect ServerのIP およびポートを指定
var connectionName = 'xxxxxxx:1433;';
//CData Connect Serverで作成したユーザー
var user = 'admin';
//CData Connect Serverで設定したパスワード
var userPwd = 'xxxxxx';
//接続先DB名(CData Connect Serverのコネクション名)
var db = 'Connect_1';
  
var instanceUrl = 'jdbc:sqlserver://' + connectionName + 'databaseName=' + db;

function onOpen() {
 var spreadsheet = SpreadsheetApp.getActive();
 var menuItems = [
 {name:'データをスプレッドシートに書き込む', functionName: 'selectHubDBData'}
 ];
  spreadsheet.addMenu('HubDB データを取得', menuItems);
}

/*
 * 指定したHubDB のテーブルからデータを読み込み、指定したシートに書き込みます。
 *  シートが存在しない場合、新規に作成されます。
 */
function selectHubDBData() {
 var thisWorkbook = SpreadsheetApp.getActive();
 
 //select a sheet and create it if it does not exist
 var selectedSheet = Browser.inputBox('データを書き込みたいシートを指定してください',Browser.Buttons.OK_CANCEL);
 if (selectedSheet == 'cancel')
   return;
 
 if (thisWorkbook.getSheetByName(selectedSheet) == null)
  thisWorkbook.insertSheet(selectedSheet);
 var resultSheet = thisWorkbook.getSheetByName(selectedSheet);
 var rowNum = 2;
 
 //select a HubDB 'table'
 var table = Browser.inputBox('データを取得したいテーブルを指定してください',Browser.Buttons.OK_CANCEL);
 if (table == 'cancel')
   return;
 
 // JDBCでデータベースへのコネクション確立
 var conn = Jdbc.getConnection(instanceUrl , user, userPwd);
 var stmt = conn.createStatement();
 
 //入力したテーブルが利用可能か検証します
 var dbMetaData = conn.getMetaData();
 var tableSet = dbMetaData.getTables(null, null, table, null);
 var validTable = false;
 while (tableSet.next()) {
   var tempTable = tableSet.getString(3);
   if (table.toUpperCase() == tempTable.toUpperCase()){
     table = tempTable;
     validTable = true;
     break;
   }
 } 
 tableSet.close();
 if (!validTable) {
   Browser.msgBox("テーブル名が不正です:" + table, Browser.Buttons.OK);
   return;
 }
     
 // 実行したいSQL
 var results = stmt.executeQuery('SELECT * FROM [Connect_1].[Account];');
    
 var numCols = results.getMetaData();
    
 const sheet = SpreadsheetApp.getActiveSheet();
 const lastRow = sheet.getLastRow();
    
 let i = 1;
 while (results.next()) {
    
   var clmString = '';
   for (var col = 0; col < numCols.getColumnCount(); col++) {
       if (col==0){
         for(var j=1; j<=numCols.getColumnCount(); j++) {
           sheet.getRange(1, j).setValue(numCols.getColumnName(j))
         }
       }
     
     clmString = results.getString(col + 1);
     Logger.log(clmString);
     sheet.getRange(i+1, col+1).setValue(clmString);
   }
   i++;
 }
    
 results.close();
 stmt.close(); 
}

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。