Created
March 10, 2023 01:51
-
-
Save Tomokatsu-Sakamoto/9e4cd13bee6955e4e12c3ccd7e429e96 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"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