🗣️

ChatGPT課金したらGASコード生成捗った話

2023/04/06に公開

月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