LoginSignup
0
1

GASとYahooAPIを使ってGoogleスライドへ自動ルビ振り

Last updated at Posted at 2023-08-24

概要

Googleスライドで資料を作っており、一度にふりがなが触れたらなと思いやってみました。
結果として、ここまでできました。
「念の為」や「持っていきましょう」のところはおかしくなっています。(形態素分析の調整が必要?)

調整には時間がかかりそうだったので、今回は諦めました。
(最後は、人間の目で確認するため、その時手動で調整するようにしています。)

image.png

やり方

今回はYahooAPIの「ルビ振り」を使用しました。
https://developer.yahoo.co.jp/webapi/jlp/furigana/v2/furigana.html

使用するには、Client IDが必要ですので以下の手順を参考に登録を進めてください
https://developer.yahoo.co.jp/start/

実際のコード

以下のコードをGoogleスライドで使用します。

var APPID = "d*****-"; // <-- ここにあなたのClient ID(アプリケーションID)を設定してください。
var URL = "https://jlp.yahooapis.jp/FuriganaService/V2/furigana?appid=" + APPID;

function addRubyToText() {
  var slideApp = SlidesApp.getActivePresentation();
  var slides = slideApp.getSlides();
  
  for (var i = 0; i < slides.length; i++) {
    var shapes = slides[i].getShapes();
    for (var j = 0; j < shapes.length; j++) {
      var textRange = shapes[j].getText();
      if (textRange) {
        var text = textRange.asString();
        var rubyData = post(text);
        var words = rubyData.result.word;

        var currentPosition = 0; // 現在の文字の位置を追跡するための変数
        var currentLine = 0; // 現在の行を追跡するための変数
        var lineHeight = shapes[j].getText().getTextStyle().getFontSize() * 1.8; // 行の高さを推定

        // 一つのテキストボックス内で改行があった場合は、その行の文字の上にふりがなをふる
        for (var k = 0; k < words.length; k++) {
          if (words[k].surface === "\n") { // 改行を検出
            currentLine++;
            currentPosition = 0;
            continue;
          }

          if (words[k].furigana) {
            var textBox = slides[i].insertTextBox(words[k].furigana);
            var originalTextTop = shapes[j].getTop();
            var originalTextLeft = shapes[j].getLeft();
            var fontSize = shapes[j].getText().getTextStyle().getFontSize();
            textBox.getText().getTextStyle().setFontSize(fontSize * 0.5); // ふりがなのサイズを半分に

            // ふりがなのテキストボックスの大きさを調整
            var textBoxWidth = textBox.getWidth();
            var textBoxHeight = textBox.getHeight();
            //0.7の数値を変えればテキストボックスの長さを調整できます(0.5だと短すぎました)
            textBox.setWidth(textBoxWidth * (words[k].furigana.length / textBox.getText().asString().length)*0.7);
            textBox.setHeight(textBoxHeight * 0.5);

            textBox.setTop(originalTextTop + currentLine * lineHeight - fontSize * 0.5); // ふりがなを適切な行の上に配置
            textBox.setLeft(originalTextLeft + currentPosition * fontSize); // 現在の文字の位置に基づいてふりがなを配置
            currentPosition += words[k].surface.length; // 文字の位置を更新
          } else {
            currentPosition += words[k].surface.length; // ふりがながない場合も文字の位置を更新
          }
        }
        
        textRange.setText(text); // テキストボックスのテキストを更新
      }
    }
  }
}



function post(query) {
  var headers = {
      "Content-Type": "application/json",
      "User-Agent": "Yahoo AppID: " + APPID,
  };

  var param_dic = {
    "id": "1234-1",
    "jsonrpc": "2.0",
    "method": "jlp.furiganaservice.furigana",
    "params": {
      "q": query,
      "grade": 1
    }
  };
  
  var options = {
    "headers": headers,
    "payload": JSON.stringify(param_dic)
  };
  
  var response = UrlFetchApp.fetch(URL, options);
  var responseBody = JSON.parse(response.getContentText());
  
  // APIのレスポンスにresultが存在しない場合のエラーハンドリング
  if (!responseBody.result || !responseBody.result.word) {
    Logger.log("API Response: " + JSON.stringify(responseBody));
    throw new Error("APIからのレスポンスが期待した形式ではありません。");
  }
  
  // responseBodyからルビを取得して結果を返す
  var words = responseBody.result.word;
  var rubyText = "";
  for (var i = 0; i < words.length; i++) {
    if (words[i].furigana) {
      rubyText += words[i].surface + "(" + words[i].furigana + ")";
    } else {
      rubyText += words[i].surface;
    }
  }
  
  //return rubyText;
  return responseBody;
}

注意点

・オブジェクトをグループ化しているとうまくいかない
グループ化しているとその中のテキストボックスまで見ることができず、ふりがながふれない
→一時的に解除するしかないかも

・APIの利用回数には制限があります。
文字の多かったり何十ページもある資料だと、制限を超えてしまう恐れがありますので注意してください。

image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1