今回はテーブル内のセルの取得方法についての、ちょっとした解説になります。
Indesigenの表のセルを取得するにはいくつかの方法がありますので、それぞれの違いを簡単にまとめてみました。
参考にテーブル内のセルに順に番号に振るスクリプトを用意しましたので、4行6列の表を例にそれぞれの方法を解説してきます。
・セルのインデックスで取得する方法
テーブル内のセルを一つずつ追って取得する方法です。
セルを取得する場合はこの方法が基本だと言っていいでしょう。
インデックスを使用した場合の取得方法はこちら。
1 2 3 4 5 6 7 |
var myTable = app.activeDocument.selection[0]; if(myTable.constructor.name == "Table"){ for(var iCell=0; iCell<myTable.cells.length; iCell++){ var myCell = myTable.cells[iCell]; myCell.contents = iCell.toString(); } } |
テーブルを選択しスクリプトを実行した場合、以下のような結果になります。
【セルの結合なし】
0 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 |
【セルの結合あり】
0 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | |
11 | 12 | 13 | 14 | 15 | |
16 | 17 | 18 | 19 | 20 | 21 |
テーブルを親とした場合、表の様に左上から順にインデックスが割り振られており、myTable.cells[iCell]といったようにインデックス番号を指定することでセルを取得することができます。
セルが結合されている場合でも取得できますが、結合した分だけインデックスの値が繰り上がる為、同じ位置のセルを同じインデックスで取得出来るとは限りません。 あくまで先頭から何番目にあるかどうかで判断されます。
上記の表ではセルが結合された分、インデックスが繰り上がっているのが確認できると思います。
・セルのIDで取得する方法
表の各セルに割り振られたIDを指定し、セルを取得します。
1 2 3 4 5 6 7 |
var myTable = app.activeDocument.selection[0]; if(myTable.constructor.name == "Table"){ for(var iCell=0; iCell<myTable.cells.length; iCell++){ var myCell = myTable.cells.itemByID(iCell); myCell.contents = iCell.toString(); } } |
【セルの結合なし】
0 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 |
【セルの結合あり】
0 | 1 | 2 | 3 | 4 | 5 |
6 | 7 (8) |
9 | 10 (16) |
11 | |
12 | 13 | 14 | 15 | 17 | |
18 | 19 | 20 | 21 | 22 | 23 |
インデックスと同じに見えますが、インデックスはセルの結合で値が変動したのに対し、IDは値が固定されたままになっています。
IDはテーブルごとに一意の値が振られており、セルが結合されている場合は先頭のIDが結合セルに割り当てられ、残りのIDは無効となります。
上記の表で結合されたセルの”8”と”16”のIDは無効となっており、IDで取得しようとmyTable.cells.itemByID(8)といった様に指定すると、無効なオブジェクトとしてエラーになりますので注意が必要です。
表を見るとインデックスのように値が繰り上がることは無いので、同じ位置に同じIDが割り当てられているのが確認できます。
・セルの名前で取得する方法
各セルの名前を指定し、セルを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var myTable = app.activeDocument.selection[0]; if(myTable.constructor.name == "Table"){ for(var iRow=0; iRow<myTable.rows.length; iRow++){ for(var iColumn=0; iColumn<myTable.columns.length; iColumn++){ var myCellName = iColumn + ":" + iRow; //セルの名前 var myCell = myTable.cells.itemByName(myCellName); //対象のセル var addWord = myCellName.toString(); if(myCell.contents !== ""){ myCell.contents = myCell.contents + " & " + "(" + addWord + ")"; } else{ myCell.contents = "(" + addWord + ")"; } } } } |
【セルの結合なし】
(0:0) | (1:0) | (2:0) | (3:0) | (4:0) | (5:0) |
(0:1) | (1:1) | (2:1) | (3:1) | (4:1) | (5:1) |
(0:2) | (1:2) | (2:2) | (3:2) | (4:2) | (5:2) |
(0:3) | (1:3) | (2:3) | (3:3) | (4:3) | (5:3) |
【セルの結合あり】
(0:0) | (1:0) | (2:0) | (3:0) | (4:0) | (5:0) |
(0:1) | (1:1) & (2:1) | (3:1) | (4:1) & (4:2) | (5:1) | |
(0:2) | (1:2) | (2:2) | (3:2) | (5:2) | |
(0:3) | (1:3) | (2:3) | (3:3) | (4:3) | (5:3) |
そもそもセルの名前とは何なのか疑問に思われるかも知れませんが、セルの名前は”(列のインデックス:行のインデックス)”で表される文字列のことを指します。
上記の”(1:0)”と書かれたセルであれば
myTable.cells.itemByName(1:0);
といった具合で指定でき、”1:0”がセルの名前となります。
セルが結合していても問題なく取得でき、結合セルは元の名前のいずれかで指定できます。
列・行それぞれのインデックスに対し一意である為、座標のような感覚でセルを指定することが可能です。
目的のセルが表のどこにあるのか探したい場合などに有効です。
【免責事項】
今回の動作確認はWindows7のIndesignCS6で行っています。
他のバージョンでも動作すると思われますが、保障はし兼ねます。
このスクリプトを使用し発生した不具合等については一切の責任を負い兼ねますのでご了承下さい。