SQL Gateway 経由で Google Apps Script から SharePoint Excel Services のデータに接続

Jerod Johnson
Jerod Johnson
Senior Technology Evangelist
ODBC Driver for SharePoint Excel Services と SQL Gateway を使用して、Google Apps Script からSharePoint Excel Services のデータにアクセスする方法を紹介します。

Google Apps Script を使用すると、Google Sheets、Google Docs など、Google ドキュメント内でカスタム機能を作成できます。CData SQL Gateway を使用すると、SharePoint Excel Services 用の ODBC ドライバーを含む CData の 250種類以上のドライバーに対して MySQL インターフェースを作成できます。MySQL プロトコルは Google Apps Script の JDBC サービスでネイティブにサポートされているため、SQL Gateway を活用することで、Google ドキュメント内からリアルタイムのSharePoint Excel Services のデータにアクセスできるようになります。

本記事では、Google Apps Script から SharePoint Excel Services 用の ODBC Driver に接続する方法を説明し、SQL Gateway の設定手順と Google Spreadsheet でSharePoint Excel Services のデータを処理するためのサンプルスクリプトを紹介します。

SQL Gateway によるリアルタイム接続

SQL Gateway を使用すると、ローカルの ODBC データソースを標準的な MySQL データベースのように見せて動作させることができます。SQL Gateway で SharePoint Excel Services 用の ODBC Driver 用に新しい MySQL リモーティングサービスを作成し、SQL Gateway がインターネット接続可能なマシンにインストールされている(またはホストされた SSH サーバーに接続できる)ことを確認してください。

SharePoint Excel Services のデータに接続

まだ行っていない場合は、データソース名(DSN)で必要な接続プロパティの値を指定してください。組み込みの Microsoft ODBC データソースアドミニストレーターを使用して DSN を設定できます。これはドライバーインストールの最後のステップでもあります。Microsoft ODBC データソースアドミニストレーターを使用して DSN を作成・設定する方法については、ヘルプドキュメントの「はじめに」の章を参照してください。

ワークブックへの接続

どちらのSharePoint エディションをお使いでも、File を Excel ワークブックに設定してください。このパスは以下のプロパティからの相対パスになります。

  • Library:デフォルトではShared Documents ライブラリが使用されます。このプロパティを使って、組織内の別のドキュメントライブラリを指定してみてください。例えば、OneDrive for Business に接続する場合は、このプロパティを"Documents" に設定します。
  • Folder:このプロパティを使って、ライブラリ内のサブフォルダへのパスを指定できます。パスはLibrary で指定されたライブラリ名に関連します。

テーブルとしてのスプレッドシートデータへの接続

CData 製品では、基底API で利用可能なオブジェクトに基づいて、使用可能なテーブルを検出していきます。

API では異なるAPI オブジェクトを表示します。スプレッドシートの構成とSharePoint のバージョンに基づいてAPI を選択しましょう。

  • OData: OData API を使用すると、Excel で[挿入]->[テーブル]をクリックして作成されたExcel テーブルオブジェクト(範囲やスプレッドシートではありません)から定義されたテーブルにアクセスできます。OData API に接続する際、ワークブックにテーブルオブジェクトが定義されていない場合は、CData 製品がテーブルを返さないことがあります。テーブルとしてスプレッドシートまたは範囲に接続するには、UseRESTAPI をtrue に設定してください。
  • REST: REST API を使用すると、Excel テーブルオブジェクト、範囲、およびスプレッドシートから定義されたテーブルへアクセスできます。これがデフォルトの API です。範囲およびスプレッドシートから多数の行をリクエストすることは REST API によって制限されており、CData 製品では返される行数をデフォルトで 100 に制限しています。また CData 製品では、デフォルトで1行目からカラム名を検出します。これを無効にするには、Header を設定してください。

DefineTables を追加設定すると、Excel の範囲の構文を使用して、範囲に基づいてテーブルを定義できます。大きすぎる範囲は、API によって制限されます。

SharePoint オンプレミスへの接続

URL をサーバー名もしくはIP アドレスに設定しましょう。さらに、SharePointVersion と認証値を設定します。

SharePoint OnPremises を認証するには、AuthScheme を認証タイプに設定し、必要に応じてUserPassword を設定してください。

Note:SharePoint On-Premises 2010 に接続する場合は、 UseRESTAPI をtrue に設定する必要があります。

    Windows(NTLM)

    最も一般的な認証タイプです。CData 製品では NTLM をデフォルトとして使用するよう事前設定されています。Windows のUserPassword を設定して接続してください。

    その他の認証方法については、ヘルプドキュメントの「はじめに」をご覧ください。

    SharePoint Excel Services のデータ用に MySQL リモーティングサービスを作成

    SQL Gateway 概要を参照して、SharePoint Excel Services のデータ を仮想 MySQL データベースとして接続を設定してください。クライアントからの MySQL リクエストをリッスンする MySQL リモーティングサービスを設定します。サービスは SQL Gateway UI で設定できます。

    リモートアクセスの設定

    ODBC Driver とリモーティングサービスがオンプレミスにインストールされている(Google Apps Script からアクセスできない)場合は、リバース SSH トンネリング機能を使用してリモートアクセスを有効にできます。詳細な手順については、Knowledge Base の記事「SQL Gateway SSH トンネリング機能」を参照してください。

    Apps Script で SharePoint Excel Services のデータに接続

    ここまでで、SharePoint Excel Services のデータ 用に SQL Gateway を設定しました。あとは Google Apps Script を使用して MySQL リモーティングサービスにアクセスし、Google Sheets でSharePoint Excel Services のデータを操作するだけです。

    このセクションでは、SharePoint Excel Services のデータ をスプレッドシートに入力するスクリプト(スクリプトを呼び出すメニューオプション付き)を作成します。サンプルスクリプトを作成し、各部分を説明しています。スクリプト全体は記事の最後で確認できます。

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

    Google Sheet 用のスクリプトを作成するには、Google Sheets のメニューからツール スクリプトエディタをクリックします。

    スクリプトエディタを開く

    2. クラス変数を宣言

    スクリプト内で作成する任意の関数から利用できるように、いくつかのクラス変数を作成します。

    //replace the variables in this block with real values as needed
    var address = 'my.server.address:port';
    var user = 'SQL_GATEWAY_USER';
    var userPwd = 'SQL_GATEWAY_PASSWORD';
    var db = 'CData ExcelServices Sys';
    
    var dbUrl = 'jdbc:mysql://' + address + '/' + db;
    

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

    この関数は Google Sheet にメニューオプションを追加し、UI から関数を呼び出せるようにします。

    function onOpen() {
      var spreadsheet = SpreadsheetApp.getActive();
      var menuItems = [
        {name: 'Write data to a sheet', functionName: 'connectToExcelServicesData'}
      ];
      spreadsheet.addMenu('SharePoint Excel Services のデータ', menuItems);
    }
    
    新しく追加されたメニューオプション

    4. ヘルパー関数を作成

    この関数は、スプレッドシート内の最初の空行を見つけるために使用します。

    /*
     * Finds the first empty row in a spreadsheet by scanning an array of columns
     * @return The row number of the first empty row.
     */
    function getFirstEmptyRowByColumnArray(spreadSheet, column) {
      var column = spreadSheet.getRange(column + ":" + column);
      var values = column.getValues(); // get all data in one call
      var ct = 0;
      while ( values[ct] && values[ct][0] != "" ) {
        ct++;
      }
      return (ct+1);
    }
    

    5. SharePoint Excel Services のデータをスプレッドシートに書き込む関数を作成

    以下の関数は、Google Apps Script の JDBC 機能を使用して MySQL リモーティングサービスに接続し、データを SELECT してスプレッドシートに入力することで、SharePoint Excel Services のデータ を書き込みます。スクリプトを実行すると、2つの入力ボックスが表示されます。

    最初の入力ボックスでは、データを格納するシートの名前を入力するよう求められます(スプレッドシートが存在しない場合は、関数が作成します)。

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

    2番目の入力ボックスでは、読み取る SharePoint Excel Services テーブルの名前を入力するよう求められます。無効なテーブルを選択した場合は、エラーメッセージが表示され、関数が終了します。

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

    この関数はメニューオプションとして使用するように設計されていますが、スプレッドシート内の数式として使用するように拡張することもできます。

    /*
     * Reads data from a specified SharePoint Excel Services 'table' and writes it to the specified sheet.
     *    (If the specified sheet does not exist, it is created.)
     */
    function connectToExcelServicesData() {
      var thisWorkbook = SpreadsheetApp.getActive();
    
      //select a sheet and create it if it does not exist
      var selectedSheet = Browser.inputBox('Which sheet would you like the data to post to?',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 SharePoint Excel Services 'table'
      var table = Browser.inputBox('Which table would you like to pull data from?',Browser.Buttons.OK_CANCEL);
      if (table == 'cancel')
        return;
    
      var conn = Jdbc.getConnection(dbUrl, user, userPwd);
    
      //confirm that var table is a valid table/view
      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("Invalid table name: " + table, Browser.Buttons.OK);
        return;
      }
    
      var stmt = conn.createStatement();
    
      var results = stmt.executeQuery('SELECT * FROM ' + table);
      var rsmd = results.getMetaData();
      var numCols = rsmd.getColumnCount();
    
      //if the sheet is empty, populate the first row with the headers
      var firstEmptyRow = getFirstEmptyRowByColumnArray(resultSheet, "A");
      if (firstEmptyRow == 1) {
        //collect column names
        var headers = new Array(new Array(numCols));
        for (var col = 0; col < numCols; col++){
          headers[0][col] = rsmd.getColumnName(col+1);
        }
        resultSheet.getRange(1, 1, headers.length, headers[0].length).setValues(headers);
      } else {
        rowNum = firstEmptyRow;
      }
    
      //write rows ofSharePoint Excel Services のデータto the sheet
      var values = new Array(new Array(numCols));
      while (results.next()) {
        for (var col = 0; col < numCols; col++) {
          values[0][col] = results.getString(col + 1);
        }
        resultSheet.getRange(rowNum, 1, 1, numCols).setValues(values);
        rowNum++;
      }
    
      results.close();
      stmt.close();
    }
      

    関数が完了すると、SharePoint Excel Services のデータ が入力されたスプレッドシートが作成され、インターネットにアクセスできる場所であれば、Google Sheets のすべての計算、グラフ作成、チャート機能を活用できるようになります。


    完全な Google Apps Script

    //replace the variables in this block with real values as needed
    var address = 'my.server.address:port';
    var user = 'SQL_GATEWAY_USER';
    var userPwd = 'SQL_GATEWAY_PASSWORD';
    var db = 'CData ExcelServices Sys';
    
    var dbUrl = 'jdbc:mysql://' + address + '/' + db;
    
    function onOpen() {
      var spreadsheet = SpreadsheetApp.getActive();
      var menuItems = [
        {name: 'Write table data to a sheet', functionName: 'connectToExcelServicesData'}
      ];
      spreadsheet.addMenu('SharePoint Excel Services のデータ', menuItems);
    }
    
    /*
     * Finds the first empty row in a spreadsheet by scanning an array of columns
     * @return The row number of the first empty row.
     */
    function getFirstEmptyRowByColumnArray(spreadSheet, column) {
      var column = spreadSheet.getRange(column + ":" + column);
      var values = column.getValues(); // get all data in one call
      var ct = 0;
      while ( values[ct] && values[ct][0] != "" ) {
        ct++;
      }
      return (ct+1);
    }
    
    /*
     * Reads data from a specified 'table' and writes it to the specified sheet.
     *    (If the specified sheet does not exist, it is created.)
     */
    function connectToExcelServicesData() {
      var thisWorkbook = SpreadsheetApp.getActive();
    
      //select a sheet and create it if it does not exist
      var selectedSheet = Browser.inputBox('Which sheet would you like the data to post to?',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 SharePoint Excel Services 'table'
      var table = Browser.inputBox('Which table would you like to pull data from?',Browser.Buttons.OK_CANCEL);
      if (table == 'cancel')
        return;
    
      var conn = Jdbc.getConnection(dbUrl, user, userPwd);
    
      //confirm that var table is a valid table/view
      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("Invalid table name: " + table, Browser.Buttons.OK);
        return;
      }
    
      var stmt = conn.createStatement();
    
      var results = stmt.executeQuery('SELECT * FROM ' + table);
      var rsmd = results.getMetaData();
      var numCols = rsmd.getColumnCount();
    
      //if the sheet is empty, populate the first row with the headers
      var firstEmptyRow = getFirstEmptyRowByColumnArray(resultSheet, "A");
      if (firstEmptyRow == 1) {
        //collect column names
        var headers = new Array(new Array(numCols));
        for (var col = 0; col < numCols; col++){
          headers[0][col] = rsmd.getColumnName(col+1);
        }
        resultSheet.getRange(1, 1, headers.length, headers[0].length).setValues(headers);
      } else {
        rowNum = firstEmptyRow;
      }
    
      //write rows ofSharePoint Excel Services のデータto the sheet
      var values = new Array(new Array(numCols));
      while (results.next()) {
        for (var col = 0; col < numCols; col++) {
          values[0][col] = results.getString(col + 1);
        }
        resultSheet.getRange(rowNum, 1, 1, numCols).setValues(values);
        rowNum++;
      }
    
      results.close();
      stmt.close();
    }
    

はじめる準備はできましたか?

SharePoint Excel Services ODBC Driver の無料トライアルをダウンロードしてお試しください:

 ダウンロード

詳細:

SharePoint Excel Services Icon SharePoint Excel Services ODBC Driver お問い合わせ

Excel Services ODBC ドライバーは、ODBC 接続をサポートする任意のアプリケーションからリアルタイムなExcel Services データに接続できるパワフルなツールです。標準のODBC ドライバーインターフェースを使用して、データベースのようにSharePoint サーバーでホストされているExcel スプレッドシートデータにアクセスし、データ連携を実行できます。