LoginSignup
2
1

More than 1 year has passed since last update.

LINE×GAS|LINEでドイツ語→日本語・英語に翻訳するアプリを作成

Last updated at Posted at 2022-09-28

本記事に記載のコードの中身については、全てを1から私が記載したわけではありません。
こちらの記事は、あくまでも参照元に倣って自分でも作ってみて、つまづいたポイント・自分で追加調査したところ・追加改造を記録した記事です。

参照元

ゴール

  • LINEでドイツ語を送ったら、英語・日本語で返ってくる。
  • スプレッドシートに記録される。

LINEの画面

trans_2022_09_28.png

スプレッドシート

LINEで翻訳_-Google_スプレッドシート_と_翻訳-_Google_検索.png

コードの中身

コード.gs
// 応答メッセージURL
const REPLY = "https://api.line.me/v2/bot/message/reply";

// アクセストークン
const ACCESS_TOKEN = "*************************";

// スプレッドシート情報
const SHEET_ID   = '*************************';
const SHEET_URL  = 'https://docs.google.com/spreadsheets/d/*************************';
const SHEET_LOG = SpreadsheetApp.openById(SHEET_ID).getSheetByName('検索履歴');

function doPost(e) {

  //メッセージ受信
  const data = JSON.parse(e.postData.contents).events[0];
  //ユーザーID取得
  const lineUserId = data.source.userId;
  // リプレイトークン取得
  const replyToken = data.replyToken;
  // 送信されたメッセージ取得
  const postMsg = data.message.text;
  // 翻訳
  const lang = 'de'
  const englishMsg = LanguageApp.translate(postMsg, lang,'en');
  const japaneseMsg = LanguageApp.translate(postMsg, lang,'ja');

  // 検索履歴にユーザーID、原文、翻訳(英語・日本語)、日時を記載
  debugLog(lineUserId, postMsg, englishMsg, japaneseMsg);
  
  // LINEに送信
  sendMessage(replyToken, `EN: ${englishMsg}\nJA: ${japaneseMsg}`);
  
}

//デバック記録
function debugLog(userId, text, eng, jap) {
  const date = Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
  SHEET_LOG.appendRow([userId, text, eng, jap, date]);
}

// LINEに送信
function sendMessage(replyToken, replyText) {
  const postData = {
    "replyToken" : replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : replyText
      }
    ]
  };
  const headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    "Authorization" : "Bearer " + ACCESS_TOKEN
  };
  const options = {
    "method" : "POST",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
  return UrlFetchApp.fetch(REPLY, options);
}

翻訳されない!

よ〜し、動いてくれよ〜ポチ〜、翻訳されない!
LINE.png

原因はシート名にあった

▶︎解説

スプレッドシートの情報を取得する以下のコードの

// スプレッドシート情報
const SHEET_ID   = '1nHSP6a2yBk2nQfsbuersE9iv4eNu6mx9o73jH79JIzw';
const SHEET_URL  = 'https://docs.google.com/spreadsheets/d/1nHSP6a2yBk2nQfsbuersE9iv4eNu6mx9o73jH79JIzw/edit#gid=0';
const SHEET_LOG = SpreadsheetApp.openById(SHEET_ID).getSheetByName('検索履歴');

シート名を取得する部分に注目。

getSheetByName('検索履歴')

「シート名が「検索履歴」というシートを取得」という内容のコードなのに、シート名がデフォルトの「シート1」だった。シート名を「検索履歴」に変更することで解消。

trans_2022_09_28.png

LINEで翻訳_-_Google_スプレッドシート.png

でも、なんかエラーがまだ出る
翻訳_-プロジェクト編集者-_Apps_Script.png

ReferenceError: replyToken is not defined
doPost	@ コード.gs:35

内容的に、replyTokenがないですよ〜っていう話っぽい。
do postの機能テストのためにコメントアウトした、部分(以下)が原因かも。

// //メッセージ受信
  // const data = JSON.parse(e.postData.contents).events[0];
  // //ユーザーID取得
  // const lineUserId = data.source.userId;
  // // リプレイトークン取得
  // const replyToken = data.replyToken;
  // // 送信されたメッセージ取得
  // const postMsg = data.message.text;
  // // 翻訳


コメントアウトを消して、テストのために入力した以下も消した上で、再テスト

const postMsg = 'neu'
const lineUserId = 'test'


replyTokenがないですよ〜っていうエラーは消えて、下記エラーが表示された。
これは、「postData」が定義されてないよっていうエラー。そもそもユーザから翻訳したい言葉(データ)を受信してないから、postDataは定義しようがない。なので、このエラーは出ても無視してOK。
▶︎参照

TypeError: Cannot read property 'postData' of undefined
doPost	@ コード.gs:15

自分向けに手順を整理

「※」がついた手順の詳細はコチラを参照する。

  1. スプレッドシートを用意
  2. シート名を「検索履歴」に変更
  3. スクリプトをコピペ
  4. LINE Botを準備※
  5. LINE Botのアクセストークンを取得し、以下部分に入力※
    // アクセストークン
    const ACCESS_TOKEN = "************************";
    
  6. スプレッドシートの情報を以下に入力
    // スプレッドシート情報
    const SHEET_ID   = '************************';
    const SHEET_URL  = '************************';
    
  7. GASとLINE Botを連携※
    GASをデプロイして、URLをLINE BotのWebhook URLに入力。

追加改造

「ドイツ語→日本語・英語」だったのを、「英語→日本語」に改造する。

LINEの画面

trans_2022_09_28.png

スプレッドシート

LINEで翻訳|日本語→英語_-Google_スプレッドシート_と_Qiita-LINE×GAS|LINEでドイツ語→日本語・英語に翻訳するアプリをつくる-_Qiita.png

改変した箇所のコード

コード.gs
  const lang = 'ja'

  const englishMsg = LanguageApp.translate(postMsg, lang,'en');
  
  // 検索履歴にユーザーID、原文、翻訳(英語)、日時を記載
  debugLog(lineUserId,postMsg,englishMsg);
  
  // LINEに送信
  sendMessage(replyToken,`${englishMsg}`);
  
}

//デバック記録
function debugLog(userId, text, eng) {
  const date = Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
  SHEET_LOG.appendRow([userId, text, eng, date]);
}

感想・学び

  • スプレッドシートを用いるときは「シート名」が結構重要になる。
  • エラーが出たらうわ〜ってなるけど、ちゃんと読んだら意外と意味がわかったりする。
  • ドイツ語からの翻訳っていう内容だったけど、違う言語にしたり、もう少しカスタマイズして学びを自分のものにしたい。
  • LINEとGASとの連携には「Webhook URL」がポイントです。
  • コードをいじったら、デプロイし直してWebhook URLも更新する必要があるので、要注意。
  • ただ倣うだけでなく、追加改造することで気づけたりコードの構成がわかったりするので、追加改造は大事。
2
1
3

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
2
1