データベースとして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ファイルを考えてみてください:
州 | 首都 | 人口 | 面積 |
---|---|---|---|
California | Sacramento | 39,100,000 | 164,000 |
Colorado | Denver | 5,300,000 | 104,000 |
New York | New York | 194,000,000 | 54,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