製品をチェック

CData Connect Cloud の詳細はコチラ

  30日間無償トライアルへ

Google Apps Script とWorkday データを連携

CData Connect Cloud を使ってGoogle Apps Script からWorkday データに接続します。

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

最終更新日:2022-06-02
workday ロゴ

CData

cloud ロゴ画像
Google Apps Script ロゴ

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

Google Apps Script を使えばGoogle スプレッドシート、Google ドキュメントといったGoogle のサービス内でカスタム機能を作成できます。CData Connect Cloud を使えば、Workday を含むCData がサポートする100以上のすべてのデータソースのSQL Server インターフェースを利用できます。SQL Server プロトコルはGoogle Apps Script のJDBC サービスでネイティブにサポートされているので、Connect Cloud を活用すればご利用のGoogle サービスからWorkday リアルタイムデータにアクセスできます。

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

CData Connect Cloud とは?

CData Connect Cloud は、以下のような特徴を持ったクラウド型のリアルタイムデータ連携製品です。

  • SaaS やクラウドデータベースを中心とする150種類以上のデータソース
  • BI、アナリティクス、ETL、ローコードツールなど30種類以上のツールやアプリケーションから利用可能
  • リアルタイムのデータ接続に対応。データの複製を作る必要はありません
  • ノーコードでシンプルな設定

詳しくは、こちらの製品資料をご確認ください。

Connect Cloud アカウントの取得

以下のステップを実行するには、CData Connect Cloud のアカウントが必要になります。こちらから製品の詳しい情報とアカウント作成、30日間無償トライアルのご利用を開始できますので、ぜひご利用ください。


Connect Cloud からWorkday への接続

CData Connect Cloud では、直感的なクリック操作ベースのインターフェースを使ってデータソースに接続できます。

  1. Connect Cloud にログインし、 Add Connection をクリックします。 コネクションの追加
  2. Add Connection パネルから「Workday」を選択します。 データソースの選択
  3. 必要な認証プロパティを入力し、Workday に接続します。

    Workday 接続プロパティの取得・設定方法

    ここでは、4つのWorkday API の接続パラメータを設定する方法、およびTenant とBaseURL を取得する方法について説明します。必要なAPI のパラメータが設定され、カスタムOAuth および / またはAzure AD API クライアントを作成したら、接続の準備は完了です。

    接続の前提条件

    API / 前提条件 / 接続パラメータ
    WQL / WQL サービスを有効化(下記参照) / ConnectionTypeWQL
    Reports as a Service / カタログレポートの設定(ヘルプドキュメントの「データアクセスのファインチューニング」参照) / ConnectionTypeReports
    REST / 自動で有効化 / ConnectionTypeREST
    SOAP / 自動で有効化 / ヘルプドキュメントのWorkday SOAP API への認証を参照

    BaseURL およびTenant の取得

    BaseURL およびTenant プロパティを取得するため、Workday にログインしてView API Clients を検索します。 この画面では、Workday はBaseURLTenant の両方を含むURL であるWorkday REST API Endpoint を表示します。

    REST API Endpoint のフォーマットは、 https://domain.com/subdirectories/mycompany です。ここで、

    • https://domain.com/subdirectories/BaseURL です。
    • mycompany(URL の最後のスラッシュの後の部分)はTenant です。

    例えば、REST API エンドポイントがhttps://wd3-impl-services1.workday.com/ccx/api/v1/mycompany の場合、 BaseURLhttps://wd3-impl-services1.workday.com であり、Tenantmycompany です。

    WQL サービスを有効化

    Workday WQL API を介して接続するには、はじめにWQL Service を有効にする必要があります。

    1. Workday を開きます。
    2. 検索バーにView Domain と入力します。
    3. プロンプトにWorkday Query Language と入力します。
    4. Allowed Security Group Types のいずれかに、接続するユーザーが含まれていることを確認します。

    Workday への認証

    Basic 認証以外のほとんどのWorkday 接続では、認証のためにOAuth ベースのカスタムAPI クライアントアプリケーションを作成する必要があります。これには、ユーザーがAzure AD 資格情報を介して接続するエンタープライズインストールも含まれます。 Workday への認証につての詳細は、ヘルプドキュメントの「Workday への認証」セクションを参照してください。

    接続の設定(Salesforce の表示)

  4. Create & Test をクリックします。
  5. 「Add Workday Connection」ページの「Permissions」タブに移動し、ユーザーベースのアクセス許可を更新します。 権限を更新

パーソナルアクセストークンの追加

OAuth 認証をサポートしていないサービス、アプリケーション、プラットフォーム、またはフレームワークから接続する場合は、認証に使用するパーソナルアクセストークン(PAT)を作成できます。きめ細かなアクセス管理を行うために、サービスごとに個別のPAT を作成するのがベストプラクティスです。

  1. Connect Cloud アプリの右上にあるユーザー名をクリックし、「Settings」をクリックします。
  2. 「Settings」ページで「Access Token」セクションにスクロールし、 Create PAT をクリックします。
  3. PAT の名前を入力して Create をクリックします。 新しいPAT を作成
  4. パーソナルアクセストークンは作成時にしか表示されないため、必ずコピーして安全に保存してください。

コネクションの設定が完了したら、Google Apps Script からWorkday データへの接続準備ができました。

Apps Script からWorkday データに接続

ここまでで、Connect Cloud でのWorkday のコネクション設定は完了していると思います。ここからは、Google Apps Script からConnect Cloud に接続して、Google スプレッドシートでWorkday データを扱います。

このセクションでは、スプレッドシートからWorkday データを取得する、スクリプトを呼び出すメニューオプション付きのスクリプトを作成していきます。本記事用に、各部分にコメントをつけたサンプルスクリプトを作成しました。サンプルスクリプトは、記事の最後に記載しています。

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

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

2.クラス変数の宣言

スクリプトで作成した関数で利用するためのクラス変数をいくつか作成します。

//replace the variables in this block with real values as needed
var address = 'tds.cdata.com:14333';
var user = 'CONNECT_USER'; // user@mydomain.com
var userPwd = 'CONNECT_USER_PAT';
var db = 'Workday1';

var dbUrl = 'jdbc:sqlserver://' + address + ';databaseName=' + db;

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

この関数はGoogle スプレッドシートに、作成した関数を呼び出すためのメニューオプションを追加します。

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name:'Export data to a sheet', functionName: 'connectToWorkdayData'}
  ];
  spreadsheet.addMenu('Workday データ', 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.Workday データをスプレッドシートに書き込む関数を作成

以下の関数はGoogle Apps Script のJDBC 機能を使ってConnect Cloud に接続し、Workday データを書き込み、データをSELECT してスプレッドシートにデータを読み込みます。スクリプトを実行すると、2つの入力ボックスが表示されます。 最初のボックスはユーザーに、データを保持するためのシート名を入力するよう求めます。スプレッドシートが存在しなければ、関数側で作成します。 シート選択用の入力ボックス

2つ目のボックスはユーザーに、読み込むWorkday テーブル名を入力するよう求めます。無効なテーブルを選択すると、エラーメッセージが表示され関数は終了します。 テーブル選択用の入力ボックス。

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

/*
 * Reads data from a specified Workday 'table' and writes it to the specified sheet.
 *    (If the specified sheet does not exist, it is created.)
 */
function connectToWorkdayData() {
  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 Workday 'table'
  var table = Browser.inputBox('Which table would you like to pull data from?',Browser.Buttons.OK_CANCEL);
  if (table == 'cancel')
    return;

  var name = Jdbc.getConnection(dbUrl, {
    user: user, 
    password: userPwd
	}	
  );

  //confirm that var table is a valid table/view
  var dbMetaData = name.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 = name.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 of Workday データ 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();
}
  

関数の処理が完了すると、スプレッドシートにWorkday データが読み込まれ、Google スプレッドシートの表計算、グラフ作成機能をどこでも自在に活用できます。


完全なGoogle Apps Script

//replace the variables in this block with real values as needed
var address = 'tds.cdata.com:14333';
var user = 'CONNECT_USER'; // user@mydomain.com
var userPwd = 'CONNECT_USER_PAT';
var db = 'Workday1';

var dbUrl = 'jdbc:sqlserver://' + address + ';databaseName=' + db;

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name:'Write table data to a sheet', functionName: 'connectToWorkdayData'}
  ];
  spreadsheet.addMenu('Workday データ', 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 connectToWorkdayData() {
  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 Workday 'table'
  var table = Browser.inputBox('Which table would you like to pull data from?',Browser.Buttons.OK_CANCEL);
  if (table == 'cancel')
    return;

  var name = Jdbc.getConnection(dbUrl, {
    user: user, 
    password: userPwd
	}
  );

  //confirm that var table is a valid table/view
  var dbMetaData = name.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 = name.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 of Workday データ 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();
}

関連コンテンツ

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

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