2022/02/23に更新

【GASで時短】文章を1文字ずつセルに分割する

スプレッドシート

セルに入力されているテキストを、1文字ずつ分解して1文字ずつセルに入れてくれるGoogle Apps Scriptです。先日作成した「スプレッドシートを一発で方眼紙にする」と組み合わせると原稿用紙に書いたようなシートが作れます。

こんな悩みを解決します


  • 1セルには1文字ずつしか入れてはいけないと指示された・・・でもそんなのやってられない!

用意するもの


特にありません。今お使いのスプレッドシートに組み込めます。

このスクリプトで出来ること


選択されているセルに入っているテキストを分割し、1セルに1文字ずつ分割することができます。
1行あたりの文字数は任意の数を入力可能です。

使い方


1.スクリプトの実行

分割したいテキストが入力されているセルを選択します。

上のメニューに有る「スクリプト実行」から「文章を1文字ずつセルに分割する」を実行します。

2.1行あたりの文字数の入力

1行あたりの文字数を半角数字で入力してください。
シートの列数を超えないように入力する必要があります。デフォルトのA〜Z列だと26が上限になります。

3.結果の確認

テキストが分割され、1文字ずつセルに入りました。

4.エラーメッセージ

1行の文字数が1以上の整数ではなかった場合は「1以上の半角整数を入力してください」を表示されてスクリプトが終了します。

指定した1行あたりの文字数が、存在する列の数より多かった場合は「列の数が足りません。増やしてから再度実行してください。現在の列数:xx」と表示されてスクリプトが終了します。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00049/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('文章を1文字ずつセルに分割する', 'split_text_by_character');

  // メニューを画面に追加する
  menu.addToUi();
}

function split_text_by_character() {

  // UIを取得
  const ui = SpreadsheetApp.getUi();

  // アクティブなスプレッドシート、シートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 1行あたりの行数を入力させる
  const response = ui.prompt('1行あたりの文字数を入力してください', ui.ButtonSet.OK_CANCEL);

  // キャンセルが押されたらスクリプトを終了する
  if (response.getSelectedButton() == ui.Button.CANCEL) {
    return;
  }

  // 入力した文字数を取得する
  const char_per_line = parseInt(response.getResponseText());

  // 入力された値が数値ではない or 1未満の場合はエラーメッセージを表示して終了する
  if (!isFinite(char_per_line) || char_per_line < 1) {
    ui.alert('1以上の半角整数を入力してください');
    return;
  }

  // 指定された1行の文字数=必要な列数になる。現在存在する列で足りるかどうかチェック。
  if (char_per_line > sheet.getMaxColumns()) {
    ui.alert('列の数が足りません。増やしてから再度実行してください。\n現在の列数:' + sheet.getMaxColumns());
    return;
  }

  // アクティブなセルを取得
  const active_cell = sheet.getActiveCell();

  // アクティブセルのテキストを取得する
  const text = active_cell.getValue();

  // テキストを1文字ずつ分割して配列にする
  const text_split = text.split('');

  // 分割した配列を格納する変数を準備
  const result = [];

  // 分割すると複数列になるため、行数を管理するためのカウンタ
  let counter = 0;

  // 1行目はループ外で定義する。1行あたりの文字数の配列を事前に作成する
  result[counter] = new Array(char_per_line);


  for (let i = 1; i <= text_split.length; i++) {

    // 結果の配列に文字を追加していく
    // 事前に配列は作られているので、そのキーに対して文字を追加。
    // ループの開始値が1なので1引いておく
    result[counter][i - (counter * char_per_line + 1)] = text_split[i - 1];

    if (i % char_per_line == 0) {
      // テキストの文字数/1行の文字数が0になったら改行する必要があるためカウンタを増加させる
      counter++;
      // 1行あたりの文字数の配列を事前に作成する
      result[counter] = new Array(char_per_line);
    }
  }

  // アクティブセルを起点に、必要な範囲を取得する
  const range = sheet.getRange(active_cell.getRow(), active_cell.getColumn(), result.length, result[0].length);

  // シートに書き込む
  range.setValues(result);

}

関連するアプリ


【GASで便利に】セルの順番を逆にする(行)

選択した行範囲の順番を逆にするGoogle Apps Scriptです。ソートではなく、単純に順番を逆にします。関数の組み合わせでも実現できますが、GASを登録してしまったほうが早いかもしれません。

【GASで便利に】セルの順番を逆にする(列)

選択した列範囲の順番を逆にするGoogle Apps Scriptです。行バージョンを作ったので、列バージョンも。ニーズはあるのでしょうか。

【GASで便利に】セルの順番を逆にする(行と列)

選択した行および列範囲の順番を逆にするGoogle Apps Scriptです。これは本当に使い所があるのかわかりませんが、作ってみたので公開します。

【GASで便利に】指定した文字数でセルに分割する(行方向)

1つのセルに入力されている文字列を、指定した文字数で分割するGoogle Apps Scriptです。区切りに使用する文字が無くても大丈夫です。行方向に分割します。

【GASで便利に】指定した文字数でセルに分割する(列方向)

1つのセルに入力されている文字列を、指定した文字数で分割するGoogle Apps Scriptです。区切りに使用する文字が無くても大丈夫です。列方向に分割します。

【GASで時短】複数セルの中身を1セルにまとめる

選択されたセル範囲のテキストを、1つのセルにまとめるGoogle Apps Scriptです。セルを分けて色々書き込んだけど、1セル内に改行して入力するんだった・・・!というときに使えるかも。

【GASで時短】選択範囲のデータをCSVで出力する

スプレッドシートの選択している範囲だけをCSVで出力するGoogle Apps Scriptです。CSVで出力したい・・・けどシート全体をCSVでダウンロードするのは面倒という方へ。

【GASで時短】スプレッドシートを一発で方眼紙にする

職場によっては使用が強制されていたり、逆に禁止されていたりする「方眼紙」を作成するGoogle Apps Scriptです。

タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp