見出し画像

自動化したい その13


前回までのあらすじ

勇者一行は、Geminiの力を借りて文章生成と見出しスタイルの適用を自動化すべく、旅立った。しかし、道のりは険しく、多くの困難が立ちはだかった。
しかし、勇者たちは諦めなかった。仲間と力を合わせ、一つ一つの課題を乗り越えていく。そしてついに、すべての課題を解決し、自動化の目的を達成するのだった。
長き旅路に終止符を打ち、勇者たちは凱旋。彼らの勝利は、多くの冒険者たちに希望を与えた。
「自動化ミッション、完了!」
勇者は力強く宣言した。その声は、世界中に響き渡った。

改良版スクリプト

改良版スクリプトは以下のとおり。

// メニューにFunctionという名前のボタンを作成
function onOpen() {
  const ui = DocumentApp.getUi();
  ui.createMenu('Function')
      .addItem('01_Geminiによる文章の修正', 'correctDocumentWithGemini')
      .addItem('02_見出しスタイルの適用と見出し目印の削除', 'applyHeadingAndDelMark')
      .addToUi();
}

// 見出しスタイルの適用と見出し目印の削除
function applyHeadingAndDelMark() {
  const body = DocumentApp.getActiveDocument().getBody();
  var paragraphs = body.getParagraphs();
  var applyStyle = false;

  for (var i = 0; i < paragraphs.length; i++) {
    var paragraph = paragraphs[i];
    var text = paragraph.getText();

    // "*****"の文字が見つかったら、それ以降の行にスタイルを適用する
    if (text === "*****") {
      applyStyle = true;
      continue;
    }

    if (applyStyle) {
      if (text.startsWith("■")) {
        paragraph.setHeading(DocumentApp.ParagraphHeading.HEADING1);
        paragraph.replaceText("■", "");
      } else if (text.startsWith("◆")) {
        paragraph.setHeading(DocumentApp.ParagraphHeading.HEADING3);
        paragraph.replaceText("◆", "");
      }
    }
  }
}

// Geminiによる文章の修正
function correctDocumentWithGemini() {
  // スクリプトプロパティからドキュメントのIDとAPIキーを取得
  var documentId = PropertiesService.getScriptProperties().getProperty('DOCID');
  var apiKey = PropertiesService.getScriptProperties().getProperty('APIKEY');

  // ドキュメントを取得
  var document = DocumentApp.openById(documentId);

  // テキストを取得
  var text = document.getBody().getText();

  // GeminiのAPIのエンドポイントURLを設定
  var apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${apiKey}`;

  // プロンプトに加え、Gemini APIリクエストに必要なペイロードを設定
  var payload = {
    "contents": [
      {"role": "user","parts": { "text": text }}
    ],
  };

  // payloadやHTTP通信種別、認証情報をoptionで設定
  var options = {
    'payload': JSON.stringify(payload),
    'method' : 'POST',
    'muteHttpExceptions': true,
    'contentType':'application/json'
  };

  // Gemini APIにAPIリクエストを送り、結果を変数に格納
  var response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText()); 

  // レスポンスを解析
  if (response && response.candidates && response.candidates.length > 0 && response.candidates[0].content.parts && response.candidates[0].content.parts.length > 0) {
    var correctedText = response.candidates[0].content.parts[0].text;

    // ドキュメントに反映
    var body = document.getBody();
    var lines = correctedText.split('\n');
    for (var i = 0; i < lines.length; i++) {
      var element = body.appendParagraph(lines[i]);
      element.setHeading(DocumentApp.ParagraphHeading.NORMAL);
    }
  } else {
    Logger.log('Error: Invalid response from the API');
  }
}

見出しスタイルの適用と目印削除を一緒に行うようにし、さらに「*****」という文字以降の行に対し見出しスタイルの適用を行うように修正した。
これにより、命令文と見出し適用を行う文章(Geminiが生成した文章)で分けることが出来るため、Googleドキュメントに記載している命令文はそのままにすることが出来るようになった。

ここがスタートライン

ようやく完成した自動化環境(半分手入力)。
環境を作ることも目的だったが、これを利用したNoteへの投稿文章の作成が本番である。
ここからさらに高みを目指すためには、やはりプロンプトの品質を上げていく必要があるな。
自動化についてはこれで終了となるが、ここがスタートラインである。
さあ、一歩を踏み出そうか。


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