🗣️
ChatGPT課金したらGASコード生成捗った話
月20$払うとGPT-4が使えるようになる。
GPT-3.5ではイマイチだったコード生成が、同じ入力でGPT-4ではうまく動いたという例を紹介
やりたかったこと
スプレッドシートから網羅表を生成してくれるGASスクリプト
スプレッドシートへの入力値
この状態で実行
期待する出力
検証
ChatGPTへの入力
スプレッドシートのアクティブシートのA列以降にパターンのパラメータ(数は不定)をもとにパターン網羅表を作成するGASスクリプトが知りたい
例えばアクティブシートが以下のように1行目が2パターン、2行目が4パターン、3行目が2パターン、4行目が2パターンで入力されている場合
#############################
True False
1 5 20 31
ON OFF
A B
#############################
「パターン網羅表」シートに以下のように2*4*2*2で32行の表を出力する
#############################
TRUE 1 ON A
TRUE 1 ON B
TRUE 1 OFF A
TRUE 1 OFF B
TRUE 5 ON A
TRUE 5 ON B
TRUE 5 OFF A
TRUE 5 OFF B
TRUE 20 ON A
TRUE 20 ON B
TRUE 20 OFF A
TRUE 20 OFF B
TRUE 31 ON A
TRUE 31 ON B
TRUE 31 OFF A
TRUE 31 OFF B
FALSE 1 ON A
FALSE 1 ON B
FALSE 1 OFF A
FALSE 1 OFF B
FALSE 5 ON A
FALSE 5 ON B
FALSE 5 OFF A
FALSE 5 OFF B
FALSE 20 ON A
FALSE 20 ON B
FALSE 20 OFF A
FALSE 20 OFF B
FALSE 31 ON A
FALSE 31 ON B
FALSE 31 OFF A
FALSE 31 OFF B
#############################
出力されたソース
GPT3.5(Default)の出力
見るからにダメそう
function createPatternTable() {
var activeSheet = SpreadsheetApp.getActiveSheet();
var dataRange = activeSheet.getDataRange();
var values = dataRange.getValues();
var numRows = dataRange.getNumRows();
var numCols = dataRange.getNumColumns();
var patternParams = [];
var outputSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("パターン網羅表");
// アクティブシートのA列以降にあるパターンのパラメータを取得する
for (var i = 0; i < numCols - 1; i++) {
var colValues = [];
for (var j = 0; j < numRows; j++) {
colValues.push(values[j][i+1]);
}
patternParams.push(colValues);
}
// パターン網羅表を作成する
var numPatterns = numRows;
for (var i = 0; i < patternParams.length; i++) {
numPatterns *= patternParams[i].length;
}
var outputValues = [];
var patternIndex = 0;
for (var i = 0; i < numPatterns; i++) {
var rowValues = [];
for (var j = 0; j < patternParams.length; j++) {
var paramIndex = Math.floor(patternIndex / Math.pow(patternParams[j].length, j)) % patternParams[j].length;
rowValues.push(patternParams[j][paramIndex]);
}
outputValues.push(rowValues);
patternIndex++;
}
// パターン網羅表をシートに出力する
outputValues.unshift(['TRUE', '1', 'ON', 'A']);
outputValues.unshift(['', 'パターン網羅表', '', '']);
outputValues.push(['FALSE', '31', 'OFF', 'B']);
outputValues.push(['', '', '', '']);
outputSheet.getRange(1, 1, outputValues.length, outputValues[0].length).setValues(outputValues);
}
GPT-4の出力
上手く動いた。
function generatePatternTable() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const inputSheet = ss.getActiveSheet();
const outputSheetName = 'パターン網羅表';
let outputSheet = ss.getSheetByName(outputSheetName);
if (outputSheet) {
ss.deleteSheet(outputSheet);
}
outputSheet = ss.insertSheet(outputSheetName);
const inputRange = inputSheet.getRange(1, 1, inputSheet.getLastRow(), inputSheet.getLastColumn());
const inputValues = inputRange.getValues();
let combinations = [];
inputValues.forEach(row => {
let newRow = row.filter(value => value !== '');
combinations.push(newRow);
});
let result = cartesianProduct(combinations);
result.forEach((row, index) => {
outputSheet.getRange(index + 1, 1, 1, row.length).setValues([row]);
});
}
function cartesianProduct(arrays) {
return arrays.reduce((a, b) => {
return a.map(x => {
return b.map(y => {
return x.concat(y);
});
}).reduce((a, b) => {
return a.concat(b);
}, []);
}, [[]]);
}
おまけ
GPT-4で出力されたコードだと、行追加が発生した場合(デフォルトだと1000行なので1000パターン超えた際)に遅くなったので、雑に報告したらちゃんと改修してくれた。やるじゃん!
Discussion