見出し画像

(googleスプレッドシート)振り仮名(もどき)の表を作る方法

スプレッドシートで振り仮名(もどき)の表を作る方法(1行毎のデータを3行毎に展開する方法)を記録しておきます。

通常は、データーベースは、1対象に対するデータは、1行に格納すると思うので、その表を複数行に展開することはあまりないかもしれませんが、漢検の勉強で使えるかもしれません。

(1)前提
「ふりがな」、「漢字」、「級&同義語・類義語(任意のデータ)」、「意味」が、スプレッドシートに、1行ごとに入力されています。
ここでは、それぞれ、B,C,D,E列に入力されています。

左の表から、右の表を作る

(2)手順
<手順1>
J4へ以下を貼り付けます。

=IF(INDEX($B$4:$D$6419, INT((ROW(A1)-1)/3)+1, MOD(ROW(A1)-1,3)+1) = "", "-", INDEX($B$4:$D$6419, INT((ROW(A1)-1)/3)+1, MOD(ROW(A1)-1,3)+1))

この数式のBとDは、前提となる表の「ふりがな」~「級」のデータが格納されている列です。(ご自身の表に合わせて修正してください。)
また、4と6419の数字も、前提となる表の最初の行と最後の行となるよう適宜変更することになります。

<手順2>
これを、必要な行までコピーします。
(方法1) J4の右下にカーソルを当て、ドラッグします。
<注意>J4の右下にカーソルを当て、ダブルクリックすると、左(前提となる)の表の3倍の長さになるので、1/3までしかコピーできません。
これを回避するために、以下の方法があります。
(方法2)googleスプレッドシートのスクリプトを使ってJ4を、指定したセルまでコピーします。
・スプレッドシートのメニューの「拡張機能」→「Apps Script」(エディタ)→「ファイル」表記の右の「+」マークをクリックして、以下のコードで書き換えます。

function fillWithFormula() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var startCell = sheet.getRange('J4'); // 関数が入力された開始セル
  var endRow = 6419; // 繰り返したい最後の行番号
  var formula = startCell.getFormula(); // 関数を取得

  var range = sheet.getRange(startCell.getRow(), startCell.getColumn(), endRow - startCell.getRow() + 1);
  range.setFormula(formula); // 指定範囲に関数を設定
}

フロッピーマークを押して、保存します。
(カーソルが編集したいシートにあることを確認後)apps scriptのエディターに戻り、実行ボタンを押します。
なお、処理する行が多すぎるとタイムアウトになるので、その場合は、適当に区切って複数回行ってください。

このスクリプトは、汎用性が高いので、常に積んでおいてもよいかもしれません。

<手順3>
次は、「意味」の転記を行います。
K5に、以下を貼り付けます。

=INDEX($E$4:$E$6419,ROW()/3)

Eは、元の表の列、4、6149は、最初と最後の行の行数です。適宜修正してください。

<手順4>
K6,K7は、空欄としたまま、K5,K6,K7を一度に選択し、セルの右下をダブルクリックします。これで、元の表のデータ数×3倍の位置までコピーされます。
これで、トップ画像の表の出来上がりです。

<おまけ1>
複数セルごとに罫線を引きたい場合の方法を記載しておきます。
先ほどと同様にスクリプトエディタのファイルの「+」マークから新しいファイルを作成して、以下を貼り付けます。

function addCustomBorders() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var tate = 3; // 縦のセル数
  var yoko = 2; // 横のセル数

  var startRow = 4; // 処理する最初の行
  var startColumn = 10; // 処理する最初の列(1=A列)
  var lastRow = 12833; // 処理する最終行
  var lastColumn = sheet.getLastColumn(); // シートの最終列
  
  // 縦横に罫線を引くために、セル範囲を繰り返す
  for (var row = startRow; row <= lastRow; row += tate) {
    for (var col = startColumn; col <= lastColumn; col += yoko) {
      var range = sheet.getRange(row, col, tate, yoko);
      
      // 範囲全体に罫線を引く
      range.setBorder(true, true, true, true, null, null);
      
      // 内部の罫線を取り除く(中央の罫線を消す)
      if (tate > 1) {
        sheet.getRange(row, col, 1, yoko).setBorder(null, null, false, null, null, null); // 範囲の上側
        sheet.getRange(row + tate - 1, col, 1, yoko).setBorder(false, null, null, null, null, null); // 範囲の下側
      }
      
      if (yoko > 1) {
        sheet.getRange(row, col, tate, 1).setBorder(null, null, null, false, null, null); // 範囲の左側
        sheet.getRange(row, col + yoko - 1, tate, 1).setBorder(null, null, null, null, null, false); // 範囲の右側
      }
    }
  }
}

以下の値を適切なものに変更します。
var tate = 3; // 縦のセル数
var yoko = 2; // 横のセル数
var startRow = 4; // 処理する最初の行
var startColumn = 10; // 処理する最初の列(1=A列)
var lastRow = 12833; // 処理する最終行

下のような表になります。

おまけのスクリプトを使った場合

<おまけ2>
3行毎に、文字の大きさを変えたい場合について記載しておきます。

function changeFontSize() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // A列(A1, A4, A7, ...)に対してフォントサイズを12に設定
  for (var i = 1; i <= 123; i += 3) {
    sheet.getRange(i, 1).setFontSize(12); // A列
  }
  
  // A列(A2, A5, A8, ...)に対してフォントサイズを18に設定
  for (var i = 2; i <= 123; i += 3) {
    sheet.getRange(i, 1).setFontSize(18); // A列
  }

    // A列(A3, A6, A9, ...)に対してフォントサイズを18に設定
  for (var i = 3; i <= 123; i += 3) {
    sheet.getRange(i, 1).setFontSize(18); // A列
  }

}

123は、サイズ変更を施したいセルの最終行の行数を入力します。
(i,1) の1はA列を示しています。2にすればB列になります。
set.FontSize(12)は、12に変更することを示しています。

<おまけ3>
5行毎に、文字の大きさを変える場合。

function resizeTextInColumn() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var column = 3; // C列は3列目です
  var startRow = 2; // 開始行
  var step = 5; // 5行ごとに
  var fontSize = 26; // 変更するフォントサイズ

  // 最終行を取得
  var lastRow = sheet.getLastRow();

  // 指定された行のセルの文字サイズを変更
  for (var row = startRow; row <= lastRow; row += step) {
    var cell = sheet.getRange(row, column); // C列の指定行
    cell.setFontSize(fontSize); // フォントサイズを設定
  }
}

<補足>
excelの方が、簡単にできますので、エクセルをお使いの方は以下をご参照ください。

どなたかのお役に立てれば幸いです。

以上

サポートをお願いします! 漢検準1級の参考書を買いたいです。