見出し画像

SpreadsheetでChatGPTを使い作業の効率化(GAS)

こんにちは、DSCLの小橋です。
生成AIがどんどん進化し、LLMがすごいなぁと日々感じてます。
僕もアイデア出しや、文章の校正、翻訳なんかはすごく便利で、良く使っています。

今回はそんなLLM(ChatGPT 4o)を、スプレッドシートで使うGASを作ったので、ご紹介します。良かったら使ってみてください!

※Geminiも試していたんですが、 2024-08 現在だと、1分あたりのリクエスト数が少なく、すぐ回数制限にひっかかってしまうため、いったん保留としました


作ったもの

SpreadsheetにGAS(Google Apps Script)と呼ばれる仕組みを使い、ChatGPTを呼び出せるようにしています。

もともと、 =GPT(B2)みたいな便利に使えるサンプルがあって、めちゃくちゃ便利使ってました。素敵なスクリプトです↓
参考:https://qiita.com/suzuki_sh/items/e44c2526d63fe9fa89ab

使っていくうちに、キャッシュの問題でデータを保持していく必要がでてきました。そこで、自分の使い方にあわせカスタマイズを進め、「メニューからGPTを実行する形式」に変更しました。

使い方

このGASを入れると、選択したセルをInputとして、「ChatGPTを実行」メニューからアウトプットを出力できます。

たとえばペルソナを考えるとか、条件を少し文字かえて実行したりしやすい

また、標準では10セルまで複数指定ができて、いろんなバリエーションをInputにおいて試すなどできます。
出力先は、「選択したセルの右」「下」「同じセル」から選択できます。
共同編集者も、権限のアラート出るけど、許可すれば使えるっぽいです。

導入方法

1、下記コードを、GASにコピペして追加
2、OpenAIのAPI Keyを取得(いろいろなサイトに記載あり省略)
3、取得したAPI KeyをGASのスクリプトプロパティに OPENAI_API_KEY として設定
4、保存して実行(メニュー出すのためにSpreadSheetを1回リロード)
という手順で試せます。

1、下記コードを、GASにコピペして追加

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('ChatGPTを実行')
    .addItem('右にアウトプット', 'processSelectedCellsRight')
    .addItem('下にアウトプット', 'processSelectedCellsBelow')
    .addItem('同じセルにアウトプット', 'processSelectedCellsSame')
    .addToUi();
}

function processSelectedCellsRight() {
  processSelectedCells('right');
}

function processSelectedCellsBelow() {
  processSelectedCells('below');
}

function processSelectedCellsSame() {
  processSelectedCells('same');
}

function processSelectedCells(direction) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveRange();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  var maxCells = 10;

  // セルの総数を計算
  var numCells = numRows * numCols;
  if (numCells > maxCells) {
    SpreadsheetApp.getUi().alert('選択範囲が10セルを超えています。最大10セルまで選択してください。');
    return;
  }

  for (var i = 0; i < numRows; i++) {
    for (var j = 0; j < numCols; j++) {
      var cell = range.getCell(i + 1, j + 1); // Get the current cell
      var cellValue = cell.getValue();
      var outputCell;
      
      if (direction === 'right') {
        outputCell = cell.offset(0, 1); // 右隣のセル
      } else if (direction === 'below') {
        outputCell = cell.offset(1, 0); // 下隣のセル
      } else if (direction === 'same') {
        outputCell = cell; // 同じセル
      }

      if (cellValue === null || cellValue === undefined || cellValue.trim() === '') {
        continue; // 空白セルはスキップ
      }

      var gptResult = GPT(cellValue);
      outputCell.setValue(gptResult); // 出力セルに上書きで値を設定
    }
  }
}

/**
 * GPTを呼び出し、処理する関数
 *
 * @param {string} input GPTへの入力文字列
 * @param {string} [model] モデル名。デフォルトは"gpt-4o-2024-08-06"
 * @return {string} GPTで生成した結果
 */
function GPT(input, model) {
  var apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  var defaultModel = 'gpt-4o-2024-08-06';

  if (model === void 0) {
    model = defaultModel;
  }

  var URL = "https://api.openai.com/v1/chat/completions";
  var headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer " + apiKey
  };
  var body = {
    model: model,
    messages: [{ role: "user", content: input }]
  };
  var response = UrlFetchApp.fetch(URL, {
    method: "post",
    headers: headers,
    payload: JSON.stringify(body)
  });
  var result = JSON.parse(response.getContentText()).choices[0].message.content;

  return result;
}

拡張機能→ Apps Scriptを選択してコードをコピペ(ファイル名はなんでも良いと思われる)


GASのプロジェクト設定から、スクリプトプロパティを編集・追加


これで保存して、SpreadSheetをリロードして以上です!
途中、権限を求められるウィンドウが出るかもしれないので、許可してください。

Gptモデルは今は、gpt-4o-2024-08-06 を適応してますが、69行目の文字列を置き換えることで変更できます。

注意点

僕は本業がデザイナーで、エンジニアではないため、GASはChatGPTに相談して作ったものです。ご使用は自己責任で。改善案あれば、ぜひ教えてください!

以上、スプレッドシートでChatGPTを使うときの参考になれば幸いです。アイデア出しや翻訳など、スプレッドシートから直接GPTを呼び出せるの、結構便利ですよ。ちょっとプロンプト変えて、バリエーションを出したいときなんかには、特に便利です。よければ試してみてください!


この記事が気に入ったらサポートをしてみませんか?