本記事に記載のコードの中身については、全てを1から私が記載したわけではありません。
こちらの記事は、あくまでも参照元に倣って自分でも作ってみて、つまづいたポイント・自分で追加調査したところ・追加改造を記録した記事です。
参照元
ゴール
- LINEでドイツ語を送ったら、英語・日本語で返ってくる。
- スプレッドシートに記録される。
LINEの画面
スプレッドシート
コードの中身
コード.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);
}
翻訳されない!
原因はシート名にあった
▶︎解説
スプレッドシートの情報を取得する以下のコードの
// スプレッドシート情報
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」だった。シート名を「検索履歴」に変更することで解消。
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
自分向けに手順を整理
「※」がついた手順の詳細はコチラを参照する。
- スプレッドシートを用意
- シート名を「検索履歴」に変更
- スクリプトをコピペ
- LINE Botを準備※
- LINE Botのアクセストークンを取得し、以下部分に入力※
// アクセストークン const ACCESS_TOKEN = "************************";
- スプレッドシートの情報を以下に入力
// スプレッドシート情報 const SHEET_ID = '************************'; const SHEET_URL = '************************';
- GASとLINE Botを連携※
GASをデプロイして、URLをLINE BotのWebhook URLに入力。
追加改造
「ドイツ語→日本語・英語」だったのを、「英語→日本語」に改造する。
LINEの画面
スプレッドシート
改変した箇所のコード
コード.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も更新する必要があるので、要注意。
- ただ倣うだけでなく、追加改造することで気づけたりコードの構成がわかったりするので、追加改造は大事。