コンテンツにスキップ

文字列の分割

ここではオフィススクリプトを使って、カンマや空白などの区切り文字で文字列を分割する方法を、サンプルコードと併せて解説します。

Stringオブジェクトに含まれている、splitメソッドを使用します。

/**
* @param separator 区切り文字(文字列または正規表現)
* @param limit 返す要素の最大数(省略時はすべて)
* @return 分割された文字列の配列
*/
split(separator: string | RegExp, limit?: number): string[];

返り値は文字列の配列です。VBA のSplit関数と同じく、配列のインデックスは 0 から始まります。

const fruits = 'リンゴ,ミカン,バナナ'.split(',');
console.log(fruits); // ['リンゴ', 'ミカン', 'バナナ']
console.log(fruits[1]); // ミカン

区切り文字が連続している場合

Section titled “区切り文字が連続している場合”

区切り文字が連続している箇所や、末尾にある区切り文字の後ろには空文字('')の要素ができます。

console.log('リンゴ,ミカン,,バナナ,'.split(',')); // ['リンゴ', 'ミカン', '', 'バナナ', '']

空の要素が不要な場合は、filterメソッドで取り除きます。

const fruits = 'リンゴ,ミカン,,バナナ,'.split(',').filter((fruit) => fruit !== '');
console.log(fruits); // ['リンゴ', 'ミカン', 'バナナ']

手入力されたデータでは、半角カンマと読点(、)が混在していたり、区切り文字の後ろに空白が入っていたりすることがあります。

このような場合は、区切り文字に正規表現を指定します。例えば/[,、]\s*/は「,または、と、その後ろに続く 0 個以上の空白」を表します。

パターンや対象の文字列を変えて、どこで分割されるかを確かめてみましょう。

フラグ

一致した箇所3 箇所

リンゴ, ミカン、バナナ,ブドウ

  • メソッドが使う一致
  • 使われない一致

結果fruits.split(/[,、]\s*/)['リンゴ', 'ミカン', 'バナナ', 'ブドウ']

  • split は g フラグがなくても、一致したすべての箇所で分割します。

パターンや文字列を変えて、一致する箇所と結果を確かめてみましょう。

splitは、正規表現にgフラグが付いていなくても、一致したすべての箇所で分割します。replaceメソッドとは扱いが異なる点に注意してください。

また、/([,、])\s*/のように正規表現の一部を()で囲むと、()に一致した区切り文字も結果の配列に含まれます(['リンゴ', ',', 'ミカン'])。区切り文字をまとめるだけなら、()は使わずに[]で指定しましょう。

半角・全角の空白やタブで区切られた文字列は、空白を表す\sと、1 回以上の繰り返しを表す+を組み合わせた/\s+/で分割できます。

ただし、文字列の先頭に空白があると、先頭に空文字の要素ができます。以下の例で、先頭の空白の前に空文字が切り出されることを確かめてみましょう。

フラグ

一致した箇所3 箇所

リンゴ ミカン バナナ

  • メソッドが使う一致
  • 使われない一致

結果fruits.split(/\s+/)['', 'リンゴ', 'ミカン', 'バナナ']

  • split は g フラグがなくても、一致したすべての箇所で分割します。

パターンや文字列を変えて、一致する箇所と結果を確かめてみましょう。

先頭や末尾の空白は、分割する前にtrimメソッドで取り除いておくと確実です。

const fruits = ' リンゴ ミカン バナナ'.trim().split(/\s+/);
console.log(fruits); // ['リンゴ', 'ミカン', 'バナナ']

A1セルの値を区切り文字で分割し、B1セルから右方向に書き込むサンプルコードです。

セルの値を分割して書き込むサンプル
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
/** 分割する値(A1 セル) */
const text = String(sheet.getRange('A1').getValue());
/** 半角・全角のカンマと読点で分割し、前後の空白と空の要素を取り除いた値 */
const parts = text
.split(/[,,、]/)
.map((part) => part.trim())
.filter((part) => part !== '');
if (parts.length === 0) {
console.log('分割する値がありません');
return;
}
/** B1 セルから、分割した数だけ右に広げた範囲 */
const target = sheet.getRange('B1').getResizedRange(0, parts.length - 1);
// 1 行分のデータとして書き込むため、配列をさらに配列で囲む
target.setValues([parts]);
}
ABCD
1リンゴ, ミカン、バナナリンゴミカンバナナ
  • Sheet1

サンプルコードを実行した後のシート

  • A1getValue() で取得したセル
  • B1:D1setValues() で書き込んだ範囲

書き込む範囲は、分割した要素の数に合わせてgetResizedRangeで求めています。範囲と配列の大きさが一致していないとエラーになるため、要素の数が変わるデータでも同じスクリプトを使えるようにしています。

分割した値は、セルに手入力した場合と同じように Excel が解釈します。001のような数値に見える文字列は数値の1として書き込まれるため、先頭の 0 を残したい場合は、書き込む範囲の表示形式をあらかじめ「文字列」にしておいてください。

第二引数に数値を指定すると、返される配列の要素数を制限できます。

最初の区切り文字の前後だけに分けたい場合は、indexOfメソッドで区切り文字の位置を調べ、sliceメソッドで切り出します。

区切り文字に空文字('')を指定すると、1 文字ずつに分割できます。

console.log('リンゴ'.split('')); // ['リ', 'ン', 'ゴ']

分割した配列を 1 つの文字列に戻す場合は、配列のjoinメソッドを使用します。引数には、要素の間に挟む文字列を指定します。

const fruits = ['リンゴ', 'ミカン', 'バナナ'];
console.log(fruits.join('、')); // リンゴ、ミカン、バナナ