【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/


コメント