【GoogleAppsScript/Google Slide】DeepL を使ってプレゼンを一括で翻訳する

## 翻訳するの、めんどくさくない？
限界サラリーマンであれば一回くらいは **「これ翻訳しといて」** みたいな雑な依頼来ますよね。
 **「それワイの仕事じゃなくない・・・？」** みたいな仕事でも、やらざるを得ないのが限界サラリーマン。

私の場合は英語で作られたパワーポイント(google slide)を和訳しないと行けない仕事があり、泣く泣くDeepLを叩いては翻訳をコピペしていく作業を行おうと思っていたのですが、**よく考えたらGASでプレゼン全体をgoogle翻訳出来るな**に始まり、**調べたらDeepL APIが500,000字/月まで無料**だったのがわかったため、**ならdeepLでスライド全部翻訳したらええやん**と思い立ったのでスクリプトにしてみました。

プレゼン以外にも、google documentでもspreadsheetでも活用できそうですね。
限界サラリーマンの他にも、限界大学院生、ドクター、研究者のみなさんの手助けになることも祈っております。



なお記事執筆にあたり、下記のQiita、Note記事を参照にしております。

## 参考サイト
A[【GoogleAppsScript】GASでDeepL APIを叩く](https://qiita.com/pnizo/items/338b1a1398127a8942e5)
B[  DeepL API を使ってみる](https://qiita.com/rihok/items/962890b4b86ea052e54c)
C[【GAS】Google Apps Script 活用事例　Google Slides全ページを、一瞬で英語訳する。](https://note.com/nepia_infinity/n/n24f853aec521)


## 準備・使い方
①DeepLでアカウントをとって、API KEYを取得します。ココらへんは上記リンクA、Bを見てもらうとわかりやすいです。
②https://script.google.com/home からスタンドアロンのGASファイルを作成。
③新しいスクリプトが立ち上がったらサービスでSildesを追加。宗教上の理由でDeepLが使えない方はLanguageApp(google翻訳)を追加しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205043/50e36cc8-18f3-80cd-ae8d-aaa7497e9cce.png)
④下記のスクリプトをコピペして貼り付け。
⑤deepLのAPIキーとスライドIDをコピペして下記＜＞書き欄のところに貼り付け。
⑥translateWholeSlideを実行。
⑦おしまい！

## 中身

```javascript:translater.gas
const slideId="<翻訳したいスライドのID>"
  
//スライド全体を英語に翻訳する
function translateWholeSlide() {
  let presentation = SlidesApp.openById(slideId);
  let slides = presentation.getSlides();


  for (let i = 0; i < slides.length; i++) {
    let thisShapes = slides[i].getShapes()
    let preTranslateText = ""//念の為、翻訳前のテキストをスピーカーノートに書いておく

    thisShapes.map((value, index) => {
      let text = value.getText().asString()

      if (text.trim() !== "") {//オブジェクトにテキストがなければスキップ
        //let translatedText = LanguageApp.translate(text, 'en', 'ja');//deepL APIが使えない場合はGoogle 翻訳で
        let translatedText =deepltranslate(text, 'en', 'ja');//英語から日本語に。(text, 'ja','en')なら日本語から英語に。
        value.getText().setText(translatedText);//翻訳されたテキストを、翻訳元のtextが入っていたShapeに入れる

        preTranslateText += `Object(${index}) : ${text} \n`
      }
    })
    let speakerNote = slides[i].getNotesPage().getSpeakerNotesShape().getText()   //スピーカーノートの取得 
    speakerNote.appendText("\n" + preTranslateText)//翻訳前のテキストをスピーカノートに追加する
  }
}
```



```javascript:deepL.gas
//以下ほぼリンク②に記載のスクリプトのパクリ
const apiKey = '<取得したAPIキー>';
const apiUrl = 'https://api-free.deepl.com/v2/translate';

function deepltranslate(text, src, tgt) {
  let t = text.toString();
  let content = encodeURI(`auth_key=${apiKey}&text=${t}&source_lang=${src}&target_lang=${tgt}`);

  const postheader = {
    "accept":"gzip, */*",
    "timeout":"20000",
    "Content-Type":"application/x-www-form-urlencoded"
  }  

  const parameters = {
    "method": "post",
    "headers": postheader,
    'payload': content
  }

  try {
    let response = UrlFetchApp.fetch(apiUrl, parameters);
  }
  catch (e) {
    Logger.log(e.toString());return 'DeepL:Exception';
  }

  let response_code = response.getResponseCode().toString();
  if (response_code != 200) return `DeepL:HTTP Error(${response_code})`
      
  let json = JSON.parse(response.getContentText('UTF-8'));// JSONからテキストを取り出す
  return json.translations[0].text;
}
```











## 最後に
・どちらかというと日本語のスライドを英語圏むけの人向けに英訳するときのほうが使いみち多そう。
・deepL API無料分は500,000字/月だけど調子乗ってたらすぐ使い切りそう。
・Google SlideはあまりGASでいじっている人が多くなさそうだから、もっといろんな使いみちがありそう。








大学の頃、ゲロ吐きそうな顔しながら電子辞書ポチポチしてたのに比べたら楽な世の中になったな～～～!なんて思いました。
ほなまたな！