ChatGPTで作った文章の見出しを整えるためのGAS

Googleドキュメント用。

どういうことか

ChatGPTで段落分けされた文章は、そのままだと文字サイズとか太字とかで見出し部分が装飾されてるんだけど、コピーしたデータはこんな感じになってる。

# タイトル
## 見出しレベル1
### 見出しレベル2
#### 見出しレベル3
**1-1. 下位見出し**
**1-2. 下位見出し**
**1-3. 下位見出し**
**1-4. 下位見出し**
##### 見出しレベル4
**2-1. 下位見出し**
**2-2. 下位見出し**
**2-3. 下位見出し**
**2-4. 下位見出し**

記号が邪魔くさいので削除するついでに、削除しただけだとよくわからないのでGoogleドキュメント上のフォーマットで見出しを付与してやろうという企み。

手作業だとだるいのでGASで済ませる。

使い方

  1. ChatGPTで文章を作成する
  2. Googleドキュメントに文章を貼り付ける
  3. Apps ScriptにGASを貼り付けて実行する
  4. ドキュメントに戻ると整形されてる

GAS

function formatChatGPTHeadings() {
  var body = DocumentApp.getActiveDocument().getBody();
  var paragraphs = body.getParagraphs();
  var currentHeading = null;
  for (var i = 0; i < paragraphs.length; i++) {
    var paragraph = paragraphs[i];
    var text = paragraph.getText();
    if (text.startsWith("# ")) {
      currentHeading = DocumentApp.ParagraphHeading.TITLE;
      formatHeading(paragraph, currentHeading);
      removeHeadingSymbol(paragraph, "# ");
    } else if (text.startsWith("## ")) {
      currentHeading = DocumentApp.ParagraphHeading.HEADING1;
      formatHeading(paragraph, currentHeading);
      removeHeadingSymbol(paragraph, "## ");
    } else if (text.startsWith("### ")) {
      currentHeading = DocumentApp.ParagraphHeading.HEADING2;
      formatHeading(paragraph, currentHeading);
      removeHeadingSymbol(paragraph, "### ");
    } else if (text.startsWith("#### ")) {
      currentHeading = DocumentApp.ParagraphHeading.HEADING3;
      formatHeading(paragraph, currentHeading);
      removeHeadingSymbol(paragraph, "#### ");
    } else if (text.startsWith("##### ")) {
      currentHeading = DocumentApp.ParagraphHeading.HEADING4;
      formatHeading(paragraph, currentHeading);
      removeHeadingSymbol(paragraph, "##### ");
    } else if (text.startsWith("**") && text.endsWith("**")) {
      if (currentHeading == DocumentApp.ParagraphHeading.TITLE) {
        formatHeading(paragraph, DocumentApp.ParagraphHeading.HEADING1);
      } else if (currentHeading == DocumentApp.ParagraphHeading.HEADING1) {
        formatHeading(paragraph, DocumentApp.ParagraphHeading.HEADING2);
      } else if (currentHeading == DocumentApp.ParagraphHeading.HEADING2) {
        formatHeading(paragraph, DocumentApp.ParagraphHeading.HEADING3);
      } else if (currentHeading == DocumentApp.ParagraphHeading.HEADING3) {
        formatHeading(paragraph, DocumentApp.ParagraphHeading.HEADING4);
      }
      removeHeadingSymbol(paragraph, "**");
      removeHeadingSymbol(paragraph, "**");
    }
  }
}
function formatHeading(paragraph, headingStyle) {
  paragraph.setHeading(headingStyle);
}
function removeHeadingSymbol(paragraph, symbol) {
  var text = paragraph.getText();
  if (text.startsWith(symbol)) {
    paragraph.setText(text.substring(symbol.length).trim());
  }
  if (text.endsWith(symbol)) {
    paragraph.setText(text.substring(0, text.length - symbol.length).trim());
  }
}

仕様として、「#」はTITLE、「##」以降は見出し1~4で付与。

「**」で囲ってる部分は上位見出しより下のレベルになるようにする(見出し4が一番下なのでそれ以下になるとただの段落)。

どうやって作ったか

GASは書けないし調べても望むものが出てこなかったけど、ChatGPTで作れた。
動作チェックだけすればいいんで楽ですね。

作ったのを調整した。

今後

リストとかにも対応できるようになったらいいですね。

抽出のルールをどうするかが課題。

コメント

タイトルとURLをコピーしました