見出し画像

【生成AI×GAS】全組み合わせのリストを作る

オレンジピーチのトシです。
今回は、前回作成した方針に沿って、GAS(Google Apps Script)の作成を進めて行きます。
(前回の記事はこちら)


全組み合わせのリストを作る

今回の完成イメージ:やりたいこと

それぞれの要素について、全組み合わせのパターンを書き出すGASを作成します。
例としては、「大きさ」と「品質」の組み合わせがあります。
大きさの水準として、「大玉・中玉・小玉」の3種類がありますが、それぞれの水準に対して、「品質」の「優・良」の水準があるため、組み合わせは6種類になります。

全組み合わせの例
「大きさ」と「品質」の組み合わせ結果

完成イメージの解像度を上げる。(やりたいことを明確にする)

 生成AIへのプロンプトを考えるにあたり、完成イメージの解像度を上げていきます。

  • まず、スプレッドシートに、組み合わせる要素を書き出していきます。

  • 次に、それぞれの要素に対して、選択可能な水準を書き加えていきます。

  • いくつの組み合わせを行うかは、作りたいものに一覧表によってまちまちなので、データの範囲は動的に変化出来るようにします。
    つまり、A1セルを起点にして、列方向に最終列まで要素があり、それぞれの要素に対して、行方向の最下段まで水準が記載されています。

  • それぞれ1行目は、要素名なので、組み合わせには使用しません。

  • シートの名前は「全組み合わせマスタ」とします。

  • これらの項目すべての可能な組み合わせを生成します。

  • 生成した組み合わせ結果を「全組み合わせ結果」という名前の新しいシートに出力します。このシートが存在しない場合は作成し、存在する場合は旧データをクリアして上書きします。

  • 「全組み合わせ結果」のシートの1行目は、要素名を含むヘッダー行として、ヘッダー行の背景色を薄い水色「#C9DAF8」に設定します。

なるべく具体的に、できればGASのスクリプトをイメージしながら、やりたいことを書き出していきます。

全組み合わせマスタの例

生成AIへの指示文(プロンプト)を考える

いよいよプロンプトを考えます。
初めから完成を目指すのではなく、大きなポイントから指示を出していき、生成AIとの対話を通じて、GASを完成させていくつもりで考えるのが良いと思います。

プロンプト:
次のタスクを実行するGAS(Google Apps Script)を生成してください。
1. GASはコンテナバインドスクリプトで作成し、組み合わせの要素と水準は、シート名「全組み合わせ」に記載しています。
2. シート「全組み合わせ」には、列方向に「要素」が、行方向に「水準」記載されています。
3. 「要素」はA1セルから最終カラムまで記載されています。
4. 各要素には複数の「水準」を持っていますが、その数はまちまちなので、各カラムの2行目から最終行までが水準の項目となります。
5. それぞれ1行目は、要素名なので、組み合わせには使用しません。
6. シートの名前は「全組み合わせマスタ」とします。
7. これらの項目すべての可能な組み合わせを生成します。
8. 生成した組み合わせ結果を「全組み合わせ結果」という名前の新しいシートに出力します。このシートが存在しない場合は作成し、存在する場合は旧データをクリアして上書きします。
9. 「全組み合わせ結果」のシートの1行目は、要素名を含むヘッダー行として、ヘッダー行の背景色を薄い水色「#C9DAF8」に設定します。
10. スクリプトには各ステップを説明する詳細なコメントを含めてください。
GAS作成に不足している情報や不明な点があれば、質問してください。

生成AIへの指示文(プロンプト)

生成AIに指示を出す

生成AIに指示を出します。
今回は、生成AIとして、Microsoft Copilot を使用しました。

生成AIは、同じ質問をしても、異なる回答が返ってくることが多いので、もしこの記事をご覧になって、同じように質問しても、違う回答となるかもしれません。しかし、簡単なプログラムなので、概ね動くものにはなるかとおもいます。 (生成AIの安全性については、様々な議論が行われているため、会社で使う場合は、自社の利用規定などを確認してから使用してください。 また、個人情報などは入力しないか、生成AIごとの推奨に基づいた形での利用をお薦めします。)

指示の出し方は、上で作成したプロンプトを貼り付けるだけです。

生成AIからの返事が届く

指示文を出すと、すぐに回答が返ってきました。

コードの部分は、こんな感じです。
各ステップにコメントも記載されています。

function generateCombinations() {
  // アクティブなスプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var inputSheet = spreadsheet.getSheetByName("全組み合わせマスタ");
  var lastColumn = inputSheet.getLastColumn();
  var combinations = [];
  
  // 各カテゴリーの選択項目を取得
  var categories = [];
  var headers = [];
  for (var col = 1; col <= lastColumn; col++) {
    headers.push(inputSheet.getRange(1, col).getValue());
    var lastRow = inputSheet.getRange(2, col, inputSheet.getMaxRows()).getValues().filter(String).length + 1;
    var range = inputSheet.getRange(2, col, lastRow - 1);
    categories.push(range.getValues().flat());
  }
  
  // 組み合わせを生成
  function combine(arr) {
    if (arr.length === 0) {
      return [[]];
    }
    var result = [];
    var rest = combine(arr.slice(1));
    for (var i = 0; i < arr[0].length; i++) {
      for (var j = 0; j < rest.length; j++) {
        result.push([arr[0][i]].concat(rest[j]));
      }
    }
    return result;
  }
  
  combinations = combine(categories);
  
  // 全組み合わせ結果を出力
  var outputSheet = spreadsheet.getSheetByName("全組み合わせ結果");
  if (!outputSheet) {
    outputSheet = spreadsheet.insertSheet("全組み合わせ結果");
  } else {
    outputSheet.clear();
  }
  
  // ヘッダー行を追加
  var headerRow = headers;
  outputSheet.getRange(1, 1, 1, headerRow.length).setValues([headerRow]);
  outputSheet.getRange(1, 1, 1, headerRow.length).setBackground("#C9DAF8");
  
  // 組み合わせを出力
  var outputRange = outputSheet.getRange(2, 1, combinations.length, combinations[0].length);
  outputRange.setValues(combinations);
}

ざっと内容を見て、分からない箇所があれば、問い合わせを行いましょう。
例えば、「各カテゴリーの選択項目を取得」のところで、次のような質問を行ってみます。

すると、生成AIが詳しく説明してくれます。
(実際には、もっと長い解説を行ってくれています。)
コードが「アロー関数」という書き方をしているため、難しく見えますが、処理している内容はfor文であることが分かります。

内容が理解出来たら、早速GASの作成に進みます。

GASを作成する

ここでも行うことは、生成AIが作成したコードを、GASのエディタに貼り付けるだけです。

GASが実行されると、一覧表が作成される

作成したGASをはじめて実行する際には、ドライブへのアクセス権限などの承認が必要です。(詳しく知りたい人は、下部に詳しい記事へのリンクを貼っています)

GASを実行すると、問題なく一覧表が作成できました!

GASで作成した一覧表

まとめ

今回は、それぞれの要素について、全組み合わせのパターンを書き出すGASを作成する方法を紹介しました。
複雑な内容と思われるGASも、やりたいことを言語化して、徐々に分解するとともに、指示イメージの解像度をあげることで、生成AIへの指示文(プロンプト)を作成することが出来ました。

また、指示イメージを具体化することに難しさを感じた人は、ぜひ、プロンプトの最後に、「GAS作成に不足している情報や不明な点があれば、質問してください。」の一文を足してみて下さい。
指示に不足があれば、生成AIから質問が返ってくるので、それに答えることで自然と指示の内容が補足されていきます。

次回は、要素によって組み合わせの水準が変わるような場合にも対応出来るGASを作成していきたいと思います。

今回は以上です。最後まで読んで頂き、ありがとうございました。
記事の内容が参考になった方は、「スキ」して頂けると励みになります。

この記事が少しでもお役に立てたのなら、サポートいただけると嬉しいです。頂いたご支援は、今後の活動費やコンテンツの質向上に使わせていただきます。