株式会社etika(エティカ)CRMサポートセンターです。
Zohoの独自スクリプト言語Deluge(デリュージ)で、複数行のテキスト(メモや議事録など)を1行ずつ処理しようとして、こう書いた経験はありませんか。
lines = content.toList("\n"); // ← 期待通りに分割されない
この記事では、なぜDelugeで改行分割がうまくいかないのか、そして実務で使える2つの回避策を、実際に動かしたコードで解説します。
結論(先に要点)
- Delugeでは
"\n"のような改行文字リテラルがそのまま書けず、toList("\n")での行分割は当てにできない- 対策A:改行に依存しない独自の区切り文字(例:
■)でフォーマットを設計しtoList("■")で分割する- 対策B:どうしても改行文字が必要なら
zoho.encryption.base64Decode("Cg==")で改行文字を生成する
なぜ改行で分割できないのか
Delugeのスクリプトエディタでは、文字列リテラルの中に改行を表すエスケープシーケンス(\n)を書いても、環境によって改行文字として解釈されず、toList("\n")が1件のリストしか返さない、あるいは意図しない挙動になることがあります。「改行で分割しているつもりが、全文が1要素のまま」という状態に陥りがちです。

そのため、改行そのものを分割の境目にする設計は避けるのが安全です。
対策A:改行に依存しない区切り文字を使う
一番堅いのは、そもそも改行を分割の境目にしないことです。処理対象のテキストを、あらかじめ決めた記号で区切るフォーマットにします。たとえば議事録メモを次のように書きます。
■総額:1,200万円
■完了予定日:2026/09/30
■ステージ:交渉
■次回アクション:決裁者同席の打ち合わせ設定
これを■で分割すれば、改行に一切依存せず各項目を取り出せます。
segments = content.toList("■");
for each seg in segments
{
s = seg.trim();
if(s == "") { s = "-"; }
// 「ラベル:値」を全角コロン優先で分解
sep = ":";
if(s.contains(":")) { sep = ":"; }
label = ifnull(s.getPrefix(sep), "").trim();
value = ifnull(s.getSuffix(sep), "").trim();
info label + " = " + value;
}
この方式なら、■要約:の後に複数行の箇条書きが続いても、次の■が来るまでを1つの値として丸ごと保持できます。
対策B:base64で改行文字を作る
「値の中に含まれる改行だけを削りたい」「先頭行だけ取りたい」といった、改行文字そのものが必要な場面もあります。その場合はbase64デコードで改行文字(LF)を生成します。
// "Cg==" は LF(改行, 0x0A)のbase64表現
nl = zoho.encryption.base64Decode("Cg==");
// 例1: 改行を含む値から先頭行だけ取り出す
if(value.contains(nl))
{
value = ifnull(value.getPrefix(nl), value).trim();
}
// 例2: HTMLの<br>を改行に変換する
content = content.replaceAll("<br>", nl);

Cg==はLF(\n, 16進で0x0A)のbase64です。CR+LFを使いたい場合はDQo=(\r\n)を使います。このnl変数を1つ用意しておけば、contains replaceAll getPrefix などの文字列操作で自由に改行を扱えます。
使い分けの指針
| 状況 | 推奨 |
|---|---|
| これから入力フォーマットを設計できる | 対策A(■など独自区切り) |
| 既存の改行入りテキストを処理する | 対策B(base64で改行生成) |
| 1行テキスト項目に多行が入ると更新拒否される | 対策Bで先頭行だけ抽出 |
まとめ
Delugeの改行分割は「動かない前提」で設計するのが実務的です。入力を自分で決められるなら区切り文字方式(対策A)、既存テキストを扱うならbase64での改行生成(対策B)。この2つを覚えておけば、メモ・議事録・メール本文などの複数行テキスト処理でつまずくことはほぼなくなります。



