【GoogleAPPScript】デシジョンテーブルの作成を自動化してみた

前回から4か月空きました・・・。

ネタがないというところと仕事に忙殺されて時間がなくて、ブログに割く余力がありませんでした。久しぶりにGoogleAppScriptネタです。

 

テストケースの洗出しでデシジョンテーブルを作成する必要が出てきて、GIHOZを使えれば簡単に作成できるものの、そういうテストツールにはお金を出してくれない環境なので、何とかできないか考えてみた。最初はEXCELで何とかしようと考えてVBAでデシジョンテーブル作成してくれるまんまのものがあったものの欲しかったものと違う。

会社ではGoogleスプレッドシートを使っているのでまぁ関数をコピペするだけで何とかできないかと思ったものの、そもそもEXCELですらVBAを使ってやっておられるくらいなのでそういう関数もなく。自分は頭悪いのでそういう内容も思いつかず

GAS使って何とかするしかないよなということで探しましたが見つからず・・・・。困り果てていたところでpythonでデシジョンテーブル作成されている方がいらっしゃってそこでアイデアコピペでググりましたよ。

フルコピペでGAS作成しました。まぁ意図通りのができたのでめでたしめでたしです。


■GASコード

function myFunction() {
  const SHEET_URL = SpreadsheetApp.getActiveSpreadsheet().getUrl();
  const ss = SpreadsheetApp.openByUrl(SHEET_URL);
  const cs =  ss.getSheetByName('デシジョンテーブル検討');
  const START_ROW = 3; 
  const CONDITION_COL = 1;
  const ACTION_COL = 2;
  const SHEETNAME_CELL = 'B1'

  // conditional partial generation
  const TRUE_MARK = 'Y';
  const FALSE_MARK = 'N';
  const packet = {};

  let combinationSubtract = 2;
  const combinationList = getPramList(cs,START_ROW,CONDITION_COL,combinationSubtract);
  for (const key of combinationList ) {
        packet[key] = [TRUE_MARK, FALSE_MARK];
  }
  const decisionTableList = arrayProduct(Object.values(packet));
  const transpose = a=> a[0].map((_, c) => a.map(r => r[c]));
  const ssbodyArray = transpose(decisionTableList);
  // Get actions from spreadsheets
  let actionSubtract = 1;
  const actionsList = getPramList(cs,START_ROW,ACTION_COL,actionSubtract);
  // write spreadsheet
  const sheetname = getsheetName(cs,SHEETNAME_CELL)
  writeSheet(ss,combinationList,ssbodyArray,actionsList,sheetname,CONDITION_COL,ACTION_COL);
}

/*
   Create all YN combinations of elements
   https://gist.github.com/cybercase/db7dde901d7070c98c48
*/
function arrayProduct(...arrays) {
    return arrays[0].reduce((prevAccumulator, currentArray) => {
        let newAccumulator = [];
        prevAccumulator.forEach(prevAccumulatorArray => {
            currentArray.forEach(currentValue => {
                newAccumulator.push(prevAccumulatorArray.concat(currentValue));
            });
        });
        return newAccumulator;
    }, [[]]);
}

/*
  Fetching List from a Spreadsheet
*/
function getPramList(targetSheet,startRow,targetCol,subtractRow){
  const lastRow = targetSheet.getRange(startRow, targetCol).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  const paramList = targetSheet.getRange(startRow,targetCol,lastRow -subtractRow).getValues();
  return paramList
}

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

/*
  Write values into a spreadsheet
*/
function writeSheet(targetSheet,array1,array2,array3,sheetname,array1Col,array2Col){
  let newSheet = targetSheet.insertSheet();
  targetSheet.moveActiveSheet(targetSheet.getNumSheets());
  newSheet.setName(sheetname)
  newSheet.getRange(1,array1Col,array1.length,array1[0].length).setValues(array1);
  newSheet.getRange(1,array2Col,array2.length,array2[0].length).setValues(array2);
  const lastRow = newSheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  newSheet.getRange(lastRow +1 ,1,array3.length,array3[0].length).setValues(array3);
}

■設定用シート








■出力されたデシジョンテーブル






■その他参考サイト

https://jill-tone.com/gas-transpose/

https://kamatimaru.hatenablog.com/entry/2021/07/07/010134

https://qiita.com/higuma/items/5af4e62bdf4df42ce673

コメント

このブログの人気の投稿

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

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

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