【GoogleAPPScript】GASでマトリクス表を作成させる

 上司から何かあるとすぐにマトリクス表で考えろと言われるので、マトリクス表を手動で作っていたけど、これ規模が拡大してくると絶対ミスるよなと思い、Googleスプレッドシートで自動生成してくれるものを準備した。

なんか最近こういうの多い・・・・。

同じ文字列だと数字の1を立ててくれて総当たりみたいなことはできるようにはしています。

なので、総当たりみたいな感じのことをしたときは同じものが当たらない様にはしてくれます。


■GASコード

function matrix() {
  const SHEET_URL = SpreadsheetApp.getActiveSpreadsheet().getUrl();
  const ss = SpreadsheetApp.openByUrl(SHEET_URL);
  const cs =  ss.getSheetByName('マトリクス図検討');
  const START_ROW = 3; 
  const VERTICAL_COL = 1;
  const SIDE_COL = 2;
  const SHEETNAME_CELL = 'B1'

  const matrix = createMatrix(cs)

  // write spreadsheet
  const sheetname = getsheetName(cs,SHEETNAME_CELL)
  writeSheet_matrix(ss,matrix,sheetname,VERTICAL_COL);
}

function createMatrix(sheet) {
  const rangeA = sheet.getRange("A3:A").getValues(); // A4から最終行までの値を取得
  const rangeB = sheet.getRange("B3:B").getValues(); // B4から最終行までの値を取得
  const numRowsA = rangeA.filter(String).length; // A列の値が入力されている行数を取得
  const numRowsB = rangeB.filter(String).length; // B列の値が入力されている行数を取得
  // マトリクス配列を作成
  const matrixArray = [];
  // 見出し行を追加
  const headerRow = [""]; // 左上のセルは空欄
  for (let i = 0; i < numRowsA; i++) {
    headerRow.push(rangeA[i][0]);
  }
  matrixArray.push(headerRow);
  // マトリクスのデータ行を追加
  for (let i = 0; i < numRowsB; i++) {
    const dataRow = [rangeB[i][0]]; // B列の値を追加
    for (let j = 0; j < numRowsA; j++) {
      if (rangeA[j][0] === rangeB[i][0]) {
        dataRow.push("1"); // 列の文字列と行の文字列が一致した場合は1を追加
      } else {
        dataRow.push(""); // それ以外は空欄を追加
      }
    }
    matrixArray.push(dataRow);
  }
  // マトリクス配列を返す
  return matrixArray;
}

/*
  Get sheetname from a Spreadsheet
*/
function getsheetName(targetSheet,targetCell){
  const sheetName = targetSheet.getRange(targetCell).getValue();
  return sheetName
}

/*
  Write values into a spreadsheet
*/
function writeSheet_matrix(targetSheet,array1,sheetname,array1Col){
  let newSheet = targetSheet.insertSheet();
  targetSheet.moveActiveSheet(targetSheet.getNumSheets());
  newSheet.setName(sheetname)
  newSheet.getRange(1,array1Col,array1.length,array1[0].length).setValues(array1);
}

こういうシートで








こんな感じで出来上がります。







後は直交表の自動生成かなぁ、、、、。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)