スプレッドシートで空白行を削除や文字数ごとに改行するスクリプト(GAS)メモ。YMM4台本用などに

スプレッドシート 空白行を削除 YMM4
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^_^*)

この記事はGoogleスプレッドシートで、空白行を削除や文字数ごとに改行するスクリプト(GAS)を書いたのでそれについての記事です。

まとめ動画とか作る時にも使えるかもしれません。

以前作ったことあるけど文字数とか整えるの結構面倒だったので(^_^;)

●PRスペース●

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

用途:YMM4の台本を作る際にラクにしたい

私の場合はこのブログに書いた記事があるので、これをコピペして台本のベースに使いたいですね。

↓こんな感じでA列にキャラクター名、B列にテキストという形式を想定しています。

スプレッドシート 空白行を削除

↓これをCSV形式でダウンロードしてYMM4に台本として読み込めば、勝手にテキストと音声をタイムラインに追加してくれるためラクです。

スプレッドシート CSV ダウンロード

基礎知識:GAS(Google Apps Script)の使い方

GASはGoogleスプレッドシート以外でも使えるっぽい?けどスプレッドシートくらいしか使ってないので、スプレッドシートに限った話で進めます。

拡張機能 ⇒ Apps Script で画面を読みだせます。

Googleスプレッドシート GAS

↓コードをコピペして、いじりたいシートを開いたまま実行すると、コードに書いた処理をさせられます。

いくつか書いたスクリプト

自分用にいくつか書いたのでここにコピペしておきます。

新しいのを書いたらバックアップがてら追加していくかもしれません。

空白行を削除するスクリプト

記事をコピペした場合に空白行ができていたので、まとめて削除するためにChatGPT氏に書いてもらった。

空白の行があれば削除して上に寄せます。

function deleteBlankRows() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  
  // 空白の行を削除
  for (var i = data.length - 1; i >= 0; i--) {
    if (isEmptyRow(data[i])) {
      sheet.deleteRow(i + 1);
    }
  }
  
  // 行を上に寄せる
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var range = sheet.getRange(1, 1, lastRow, lastColumn);
  range.sort({column: 1, ascending: true});
}

function isEmptyRow(row) {
  for (var i = 0; i < row.length; i++) {
    if (row[i] !== "") {
      return false;
    }
  }
  return true;
}

25文字ごとにセル内で改行するスクリプト

なぜ25文字かと言えば、YMM4で25文字くらいだと良い感じに一行で表示できたから。

文字間隔やフォントサイズ次第で変わってくるけど、コードの25のところを書き換えれば何文字ごとに改行するか変えられます。

function addLineBreaks() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var columnBRange = sheet.getRange('B1:B' + lastRow);
  var values = columnBRange.getValues();
  
  for (var i = 0; i < values.length; i++) {
    var cellValue = values[i][0];
    if (typeof cellValue === 'string') {
      var formattedValue = '';
      for (var j = 0; j < cellValue.length; j++) {
        if (j % 25 === 0 && j !== 0) {
          formattedValue += '\n';
        }
        formattedValue += cellValue.charAt(j);
      }
      values[i][0] = formattedValue;
    }
  }
  
  columnBRange.setValues(values);
}

しかしレスを拾うまとめ動画とかだと改行が挟まっていたりするから、良い感じにできるかは微妙かな(^_^;)

B列のセルに三行以上あったらセルを分割、A列の値は分割前のをコピペするスクリプト

YMM4のテキストを二行までにしたい時に便利かなと思って作った。↑の25文字でセル内改行と合わせて使うと良い感じになるかも?テキスト次第だが…。

maxLinesPerCellの数値を変えれば何行ごとに分割するか変えられます。

function splitLongText() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var maxLinesPerCell = 2; // ここを変更すると、セル内の最大行数を調整可能
  var row = 1;
  
  while (row <= sheet.getLastRow()) {
    var cell = sheet.getRange(row, 2);
    var text = cell.getValue();
    var lines = text.split("\n");
    
    if (lines.length > maxLinesPerCell) {
      var firstLines = lines.slice(0, maxLinesPerCell).join("\n"); // 指定行数まで取得
      var remainingLines = lines.slice(maxLinesPerCell).join("\n"); // 残りの行を取得
      var aCellValue = sheet.getRange(row, 1).getValue(); // A列の値を取得
      
      cell.setValue(firstLines); // 元のセルを指定行数のみに更新
      sheet.insertRowAfter(row); // 次の行を追加
      sheet.getRange(row + 1, 2).setValue(remainingLines); // 新しい行に残りのテキストをセット
      sheet.getRange(row + 1, 1).setValue(aCellValue); // A列の値をコピー
    } else {
      row++; // 指定行数以下なら次の行へ
    }
  }
}

例えばセル内のテキストが7行あったら4分割され、2行2行2行1行と4つのセルに分割されます。

A列には分割前のテキストがコピペされるので、YMM4では同じキャラクターの情報が読みだされます。

キャラクター設定もしておくと、台本を読み込むだけで動画のベースがほとんど作れる

台本のテキストをちゃんと成形して、YMM4でキャラクター設定もしておけば、A列に指定したキャラクターによって立ち絵を読み出したり勝手にやってくれるので非常にラクです。

↓ダウンロードした台本を読み込んだだけでここまではできました。音声もちゃんと設定した合成音声がついてます。

ショート動画ならこれにちょっと画像入れてやるだけで十分かもしれない。

YMM4便利すぎでしょ…Σ(゚Д゚)これで無料はすごすぎる。

おわりに

スクリプト書いとくと実行するだけでシートを成形できるので便利ですね。

YMM4で使うことを想定すると、人によって台本のフォーマットも変わってくると思うから、独自に便利にするスクリプトを書いておくと良いかもしれない。

また何かあれば追記します(*^_^*)

タイトルとURLをコピーしました