Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Tomokatsu-Sakamoto/9e4cd13bee6955e4e12c3ccd7e429e96 to your computer and use it in GitHub Desktop.
Save Tomokatsu-Sakamoto/9e4cd13bee6955e4e12c3ccd7e429e96 to your computer and use it in GitHub Desktop.
"use strict"; // 変数の宣言を強要する
const LABEL_TITLE = ''; // 処理対象となるメールのラベル
const RETURN_MAIL = ''; // 返信先のメールアドレス
const TRANSLATE_LANG = 'ja'; // 翻訳対象となる言語 'ja' : 日本語
const ADD_SUBJECT = '[TRANSLATE]'; // 翻訳後のメールの件名に追加する文字列
/**
* トリガー関数を設定するためのメニュー項目を設定
*/
function onOpen() {
let ui = SpreadsheetApp.getUi(); // Uiクラスを取得する
let menu = ui.createMenu('トリガー関数'); // Uiクラスからメニューを作成する
menu.addItem('トリガー関数を設定する', 'setTrigger'); // メニューにアイテムを追加する
menu.addToUi(); // メニューをUiクラスに追加する
}
/**
* トリガー関数を設定するためのメニュー項目を設定
*/
function setTrigger() {
let triggers = ScriptApp.getProjectTriggers();
let ret = null;
for (let i = 0; i < triggers.length; i++) {
if (triggers[i].getEventType() == 'CLOCK') {
// 登録しようとしているトリガーと同じタイプのものが既に登録されている
if (triggers[i].getHandlerFunction() == 'checkGmail') {
// 登録しようとしている関数と同じ名前
ret = triggers[i].getUniqueId();
console.info('既にトリガー関数が設定されている');
break;
}
else {
// 登録しようとしている関数とは違う関数が登録されている
console.warn('異なるトリガー関数が設定されているため、削除します');
ScriptApp.deleteTrigger(triggers[i]); // 現在設定されているトリガーを削除
break; // ここで既存のトリガーを削除し、チェックを終了することで、新規に登録される
}
}
}
// 登録しようとしているトリガーが設定されていなければ、新規に登録する
if (ret == null) {
// 登録されていないので登録する
let trigger = ScriptApp.newTrigger('checkGmail')
.timeBased()
.everyMinutes(5) // 5分間隔で実行する
.create();
ret = trigger.getUniqueId();
console.info('トリガー関数を設定しました');
}
}
/**
* Gmail の受信状況をチェックして、処理対象のメールがあるかをチェックする
*/
function checkGmail() {
let label;
let target = LABEL_TITLE;
if (LABEL_TITLE == '') {
const sheet = SpreadsheetApp.getActiveSheet();
target = sheet.getRange('A1:C1').getValues();
}
for (let idx = 0; idx < target[0].length; idx++) {
// ラベル情報を取得
// https://developers.google.com/apps-script/reference/gmail/gmail-app#getuserlabelbynamename
try {
label = GmailApp.getUserLabelByName(target[0][idx]);
}
catch (e) {
continue; // 取得できなければ、次の要素に…
}
let strTo; // メールの宛先
if (RETURN_MAIL != '') { // 転送先が個別に指定されている?
strTo = RETURN_MAIL; // 指定されているアドレスを宛先に指定
}
else {
strTo = Session.getActiveUser().getUserLoginId(); // スクリプトの実行確認を行ったアドレス
}
// 指定されたラベルのスレッドを取得(先頭 20件)
// https://developers.google.com/apps-script/reference/gmail/gmail-label#getthreadsstart,-max
let threads = label.getThreads(0, 20);
for (let i in threads) {
// スレッド内のメッセージを取得
// https://developers.google.com/apps-script/reference/gmail/gmail-thread#getmessages
var msgs = threads[i].getMessages();
for (let j in msgs) {
// 「未読」のメッセージを処理対象にする
// https://developers.google.com/apps-script/reference/gmail/gmail-message#isunread
if (msgs[j].isUnread()) {
let strFrom = msgs[j].getFrom(); // 差出人
let strSubject = msgs[j].getSubject(); // 件名
let strMessage = msgs[j].getBody();
if (strSubject.indexOf(ADD_SUBJECT) != -1) {
continue; // 既に翻訳されているメールは、再度翻訳しない
}
// LanguageApp.translate 関数で指定した言語で翻訳する
// 参考:
// Google Apps Script(GAS)で翻訳する方法!英訳や和訳の実装(translateメソッド)
// https://auto-worker.com/blog/?p=2416
let transSub = LanguageApp.translate(strSubject, '', TRANSLATE_LANG); // 指定言語での翻訳
let transText = LanguageApp.translate(strMessage, '', TRANSLATE_LANG); // 指定言語での翻訳
transText = `Subject: <strong>${transSub}</strong><br>From: <strong>${strFrom}</strong><br>${transText}`;
msgs[j].forward(
strTo,
{
'name': `Programmed Translation(${TRANSLATE_LANG})`,
'htmlBody': transText,
'subject': `${strSubject} ${ADD_SUBJECT}`,
}
);
msgs[j].markRead(); // 処理済みのメッセージを既読にする
console.info(`Subject:「${strSubject}」→「${transSub}」`);
}
}
}
}
}
/**
* ユーザーが作成しているラベルの一覧を取得する
*/
function getLabelList() {
const ss = SpreadsheetApp.getActive();
const sheet = SpreadsheetApp.getActiveSheet();
clearLabelList(); // 一覧を一旦クリア
const labels = GmailApp.getUserLabels();
let proc = Math.round(labels.length / 10); // 進捗状況
let max = proc;
for (var i = 0; i < labels.length; i++) {
if (i >= max) {
max += proc;
ss.toast('ラベルの書き出し ' + Math.round((max - proc) / labels.length * 100) + '%');
}
sheet.appendRow([labels[i].getName()]);
}
ss.toast('ラベルをソート');
let maxRow = sheet.getMaxRows(); // 行数を取得
sheet.getRange(4, 1, maxRow - 3).sort(1); // 一覧をソートする
sheet.getRange('A1:C1') // A1:C1 に「データの入力規則」を再設定
.setDataValidation(
SpreadsheetApp.newDataValidation()
.setAllowInvalid(false)
.requireValueInRange(ss.getRange('$A$4:$A'), true)
.build()
);
}
/**
* ラベルの一覧をクリアする
*/
function clearLabelList() {
const sheet = SpreadsheetApp.getActiveSheet();
let maxRow = sheet.getMaxRows();
if (maxRow > 3) {
sheet.deleteRows(4, maxRow - 3); // 既に取得されている内容は、一旦削除
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment