InDesignCC2022
テキストだけが入ったテキストフレームから特定の文字を表に変換して、「表1、テキスト1、表2、テキスト2」といった表とテキストを交互に入れるスクリプトを書いているのですが、なぜか表2を入れた瞬間に表1が消えてしまいます。
// スクリプトを実行
app.doScript(main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main() {
var doc = app.activeDocument;
for (var i = 0; i < doc.textFrames.length; i++) {
var textFrame = doc.textFrames[i];
var originalText = textFrame.contents;
// 行ごとに分割
var lines = originalText.split('\r');
for (var j = 0; j < lines.length; j++) {
var line = lines[j];
if (/^01\t/.test(line)) {
textFrame.contents = "";
var table = textFrame.tables.add();
table.columnCount = 2; // 2列の表を作成
table.bodyRowCount = 1; // 1行の表を作成
var firstCell = table.cells[0];
firstCell.contents = "01";
var secondCell = table.cells[1];
secondCell.contents = line.replace(/^01\t/, ""); // 1行2列目に残りのテキストを挿入
textFrame.insertionPoints[-1].contents += "\r" + originalText;
}
}
//ここを消すと1行2列の表が入り表示していると入らない。
if (/【A5】/.test(originalText)) {
findA5(textFrame);
}
}
}
function findA5(textFrame) {
var story = textFrame.parentStory;
var text = story.contents;
var a5Pattern = /【A5】/;
var match = text.match(a5Pattern);
if (match) {
var a5Text = text.substring(match.index + match[0].length); // A5以降の文字列を取得
var a5PreviousText = text.substring(0, match.index);
story.contents = a5PreviousText;
var tableSize = textFrame.tables.add();
tableSize.columnCount = 6; // 6列の表を作成
tableSize.bodyRowCount = 6; // 6行の表を作成
textFrame.insertionPoints[-1].contents += a5Text;
}
}
画像の右側にあるテキストフレームの形が目指しているものですが、「if (/【A5】/.test(originalText)) {…」を入れていると、表2(下段の表)だけが入り、この部分を消すと表1(上段の表)だけが入るようになってしまっています。
こういう時の解決方法はあるのでしょうか?
助言をいただけると幸いです。
[21296] DTP屋の柴犬 (2023/10/06 Fri 18:41)
一度は表が入っているのですが、
> function findA5(textFrame) {
の中の
> story.contents = a5PreviousText;
のところでcontetns全体に文字列を代入してしまっているせいで表がぶっとんでいますね。
contentsではなくtextオブジェクトで扱うなどしないといけないところかと思います。
[21297] (z-) (2023/10/10 Tue 12:32)
> > function findA5(textFrame) {
>
> > story.contents = a5PreviousText;
>
> contentsではなくtextオブジェクトで扱うなどしないといけないところかと思います。
function findA5(textFrame) {
var textContents = textFrame.texts[0].contents;
var a5Pattern = /【A5】/;
var match = textContents.match(a5Pattern);
if (match) {
var a5Text = textContents.substring(match.index + match[0].length); // A5以降の文字列を取得
var a5PreviousText = textContents.substring(0, match.index);
textFrame.texts[0] = a5PreviousText;
var tableSize = textFrame.tables.add();
tableSize.columnCount = 6; // 6列の表を作成
tableSize.bodyRowCount = 6; // 6行の表を作成
textFrame.insertionPoints[-1].contents += a5Text;
}
}
助かりました!!!ようやく分かりました。
texts[0]とすることで文字のみを対象とすることができました。ありがとうございます。
[21298] DTP屋の柴犬 (2023/10/10 Tue 17:41)
完成したかと思ったのですが、肝心な部分を見落としていました。
【A5】から表の間に存在する文字「柴犬の生態」を
表の後に移動させるようにしているのですが、
【A5】の後に存在したままになってしまっています…
この場合はやはり下記の一行を変更させるか、
textFrame.insertionPoints[-1].contents += a5Text;
下記の一行に於いてa5Textを引き算のように削除する方法などあるでしょうか…?
textFrame.texts[0] = a5PreviousText;
[21300] DTP屋の柴犬 (2023/10/10 Tue 18:30)
もっと単純に考えて、作成したテーブルを移動するのではなく、作成する位置を変更するだけでよかったのですね…。お騒がせしました。
そして助かりました、ありがとうございます。
function findA5(textFrame) {
var textContents = textFrame.texts[0].contents;
var a5Pattern = /【A5】/;
var match = textContents.match(a5Pattern);
if (match) {
var insertionPoint = textFrame.insertionPoints[match.index];
var newTable = insertionPoint.tables.add();
var a5PreviousText = textContents.substring(0, match.index);
textFrame.texts[0] = a5PreviousText;
newTable.columnCount = 6; // 6列の表を作成
newTable.bodyRowCount = 6; // 6行の表を作成
}
}
[21301] DTP屋の柴犬 (2023/10/11 Wed 11:00)