メインコンテンツまでスキップ
バージョン:23.4

データベースとしてExcelを使う

SenseTalkを使用すると、Microsoft Excel (.xlsx)ファイルに保存されているデータにアクセスして、それがデータベースであるかのように扱うことができます。つまり、スプレッドシートからデータベースレコードの形でデータを読み取ることができます。この方法でExcelファイルを操作することで、SenseTalkのデータベース機能のほとんどを利用することができます。SenseTalkが直接Excelファイルからデータを読み取ったり、データをExcelファイルに書き込んだりする別のアプローチについては、Excelファイルの相互作用をご覧ください。

接続の定義

Excelをデータベースとして使用するには、接続を定義するために以下のようなコマンドを実行します。このコマンドには、Excelファイルのパスと名前が含まれています:

set myExcelDB to {type: "excel", file: "/<Path>/<MyExcelFile>.xlsx"} -- 指定した変数、myExcelDBを設定し、参照されたExcelファイルの内容を保存し、SenseTalk接続を確立します。

上記の例では、データベース接続情報が変数myExcelDBに保存されています。接続情報を変数に保存する必要はありませんが、データベースを参照するのを簡単にするために推奨されています。

先端

SenseTalkとExcelファイルの間に接続を確立し、コマンドにwriteable: Yesプロパティを含めない場合、SenseTalkはデータベースに対して変更(挿入、更新、削除)を書き戻すことができません。

Excelファイルデータベース接続の設定

他のタイプのデータベース接続(ODBC管理参照)とは異なり、Excelデータベースはデフォルトでは書き込み可能ではありません。この書き込み制限は、SenseTalkがメモリ内であなたが行った任意の変更を更新するが、これらの変更をExcelファイルに書き込まないことを意味します。SenseTalkを使ってExcelファイルをレコード追加レコード削除のコマンドを使用して更新したい場合は、以下の例に示すように、Writable: Yesプロパティを指定してデータベース接続を書き込み可能にする必要があります:

set myExcelDB to {type:"excel", file:"C:\Projects\TestFiles\States.xlsx", writable: Yes} -- 指定された変数、myExcelDBに設定し、参照されたExcelファイルの内容を保存し、書き込み可能なSenseTalk接続を確立します。

Excel接続がWritableであると、取得したレコードはすべて_pkey_プロパティプロパティ値を含みます。SenseTalkはこのプロパティ値を使用して、変更があってファイルに書き込むべき各レコードを一意に識別します。

一般的なデータベース接続リストプロパティ

  • タイプ: 必須。接続するデータベースのタイプを指定します。指定: "ODBC"または"Excel"。
  • 書き込み可能: Eggplant Functionalがこのデータベースに書き込み機能を持っているかどうかを判断します。このプロパティを使用してデータベースのこの設定を変更します。(ODBCにはデフォルトで書き込み機能が有効になっていますが、Excelではデフォルトで無効になっています。)

Excel専用接続リストプロパティ

  • ファイル: 必須。データベースとして参照したいExcelワークブックのファイルパスを指定します。

Excelをデータベースとして使用する

Excelファイルをデータベースとして使用すると、SenseTalkはファイル内の各ワークシートをデータベーステーブルとして扱います。

ワークシートの最初の行はヘッダー行として扱われ、テーブル内の列の名前を識別します。SenseTalkは、その後のすべての行をテーブル内のデータベースレコードとして扱い、空行は無視します。

以下の例のExcelファイルを考えてみてください:

首都人口面積
CaliforniaSacramento39,100,000164,000
ColoradoDenver5,300,000104,000
New YorkNew York194,000,00054,600

このファイルは、4つの列と6つの行を含む単一のワークシートを含んでいます。最後の2行は空です。

ファイルへのパスが~/Desktop/States.xlsxである場合、データベースアプローチを使用して全内容を読み取るには、これらのコマンドだけが必要です:

set myExcelDB to {type:"excel", file:"C:\Projects\TestFiles\States.xlsx"} -- 指定された変数、myExcelDBに設定し、参照されたExcelファイルの内容を保存します。
put the records of myExcelDB into states -- myExcelDB変数からすべてのレコードを取得し、それらをstates変数に配置します。
put states joined by return -- states変数からのデータを1レコード毎に表示します。

上記のコマンドを実行すると、次のデータが返されます:

each chunk of sourceExpr {where conditional} {area:104000, capital:Denver, population:5300000, state:Colorado} {area:54600, capital:New York, population:19400000, state:New York}

最初の行から列ラベルを使用して、プロパティリストとして3つのレコードが読み取られたことに注意してください。各レコードのプロパティの名前です。

ワークシートをテーブルとして指定する

Excelファイルをデータベースとして使用するとき、SenseTalkはファイル内の各ワークシートをデータベーステーブルとして扱います。次の例は、単一のワークシートのみを含むExcelファイルの情報にアクセスする方法、またはファイル内の最初のワークシートのみが関心がある場合の方法を示しています。

ワークシートを指定するには、Nameプロパティを含め、以下の例に示すように、希望のワークシートの名前または番号(1, 2, ...)に設定します:

set myExcelDB to {type:"excel", file:"C:\Projects\TestFiles\States.xlsx", name:"Counties"} -- 指定された変数、myExcelDBを設定し、参照されたExcelファイルの内容を保存し、SenseTalk接続を確立します。 "Counties"という名前のワークシートを指定します。

別のアプローチは、次のいずれかの例に示すように、テーブル構文を使用して希望のワークシートを指定することです:

set myExcelDB to table ("Counties") of {type:"excel", file:"C:\Projects\TestFiles\States.xlsx"} -- 指定された変数、myExcelDBを設定し、参照されたExcelファイルの内容を保存し、SenseTalk接続を確立します。 "Counties"という名前のデータベーステーブルを指定します。
set myExcelDB to table (2) of {type:"excel", file:"C:\Projects\TestFiles\States.xlsx"} -- 指定された変数、myExcelDBを設定し、参照されたExcelファイルの内容を保存し、SenseTalk接続を確立します。 データベーステーブルを番号で指定します。

Excelファイルへの複数の接続の作成

Eggplant Functionalでは、Excelファイルに複数の接続を作成することができますが、これにより問題やエラーが発生する可能性があります。 たとえば、Excelファイルへの接続を_ワークブック_(このページで説明)および_データベース_([ここで説明](stk-working-with-excel. md))の両方として作成すると、Eggplant FunctionalはInternalWorkbookError - data source needed but no workbook valueのようなエラーメッセージを返す可能性があります。 このエラーは、一方の接続を閉じることで修正できます。

また、Excelのワークブック内の異なるテーブルを見るために別の接続を作成することもできます。 以下に示します。

例:

set myDB1 to {file:ResourcePath("Book1.xlsx"), type:"excel", writeable:"yes"}
set mySheet to table("Sheet1") of myDB1

set myDB2 to {file:ResourcePath("Book1.xlsx"), type:"excel", writeable:"yes"}
set myOtherSheet to table("Sheet2") of myDB2