Skip to content

Instantly share code, notes, and snippets.

@githubmorley
Created November 14, 2016 03:36
Show Gist options
  • Save githubmorley/46b5fd79d86d0246c6adec620f282aad to your computer and use it in GitHub Desktop.
Save githubmorley/46b5fd79d86d0246c6adec620f282aad to your computer and use it in GitHub Desktop.
Googleスプレッドシート_翻訳支援
// 起動時処理:スプレッドシートのメニューに追加
function onOpen(event){
var ss = SpreadsheetApp.getActiveSpreadsheet();
// メニューの項目を作成
var menu = [
{name: '翻訳を実行', functionName: 'translate'},
{name: '訳の行だけ別窓に表示', functionName: 'getTranslateText'},
{name: 'シートをクリア', functionName: 'clearSheet'},
];
ss.addMenu('翻訳', menu); // メニューを追加
}
// シートの書式と値を削除
function clearSheet() {
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().clear(); // アクティブシートの書式と値を削除
}
// 翻訳
function translate() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在のスプレッドシートを取得
var sheet = ss.getSheets()[0]; // シートを取得
var range = sheet.getDataRange(); // データのある範囲
var text; // 翻訳サイトに送信する原文
var url; // 翻訳サイトに送信するURL
var match_data; // 訳文抽出用正規表現
var arData = []; // 原文データ格納
var addRow, baseRow; // 行数計算
var set_num = 5; // 1セット(原文〜訳)の行数
var numColumns = 2; // 列数
// 全行の原文のデータを配列に格納
for(var i = 1; i <= range.getNumRows(); i++){
text = String(sheet.getRange(i, 1).getValue());
if(text !== ""){
arData.push(text);
}
}
// シートの内容と書式を削除
sheet.clear();
// 原文、訳、各翻訳サイトの訳を表示
for(var i = 0; i < arData.length; i++){
text = encodeURIComponent(arData[i]); // 原文のデータを取得し、送信用に文字列を変換
baseRow = set_num * i; // 原文の行
addRow = 0; // 他の行の計算用
// 原文
sheet.getRange(baseRow + ++addRow, 1).setValue("原文"); // 行ラベル
sheet.getRange(baseRow + addRow, 2).setValue(arData[i]);
sheet.getRange(baseRow + addRow, 1, 1, numColumns).setBackground('#FFE082'); // セルの背景を塗る
// Weblio
sheet.getRange(baseRow + ++addRow, 1).setValue("Weblio"); // 行ラベル
url = "http://translate.weblio.jp/?lp=EJ&lpf=EJ&originalText=" + text; // 問い合わせ用のURL
match_data = /<div class=transResultMain ID=transResultMainLn><.l><li class=translatedTextAreaLn><span>(.*?)<\/span>/; // 訳の検出用の正規表現
sheet.getRange(baseRow + addRow, 2).setValue(getSiteData(url, match_data)); // 訳を表示
sheet.getRange(baseRow + addRow, 1, 3, numColumns).setBackground('#E0E0E0'); // セルの背景を塗る
// Dictionary.com
sheet.getRange(baseRow + ++addRow, 1).setValue("Dictionary"); // 行ラベル
url = "http://translate.reference.com/translate?src=en&dst=ja&query=" + text; // 問い合わせ用のURL
match_data = /<textarea class="form-control targetArea" id="clipboard-text" rows="1" cols="26" placeholder="Translation" readonly>(.*?)<\/textarea>/; // 訳の検出用の正規表現
sheet.getRange(baseRow + addRow, 2).setValue(getSiteData(url, match_data)); // 訳を表示
// Excite
sheet.getRange(baseRow + ++addRow, 1).setValue("Excite"); // 行ラベル
url = "http://www.excite.co.jp/world/english/?before=" + text + "&wb_lp=ENJA"; // 問い合わせ用のURL
match_data = /<textarea id="after".+>(.*)<\/textarea>/; // 訳の検出用の正規表現
sheet.getRange(baseRow + addRow, 2).setValue(getSiteData(url, match_data)); // 訳を表示
// 訳
sheet.getRange(baseRow + ++addRow, 1).setValue("訳"); // 行ラベル
}
}
// 翻訳サイトのデータを取得
function getSiteData(url, match_data) {
var response;
var check = false;
for(var i = 0; i < 5; i++){ // 5回リトライ
response = UrlFetchApp.fetch(url).getContentText();
Utilities.sleep(100); // 連続で送信しないように100msスリープ
response = response.match(match_data); // 訳の取得
if(response !== null){ // 取得できたら処理を抜ける
break;
}
}
if(response !== null) {
return response[1]; // 訳の部分を返す
} else {
return "";
}
}
// 訳の行だけ別窓に表示
function getTranslateText() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在のスプレッドシートを取得
var sheet = ss.getSheets()[0]; // シートを取得
var range = sheet.getDataRange(); // データのある範囲
var result = "";
var set_num = 5;
for(var i = 1; i <= range.getNumRows(); i+= set_num){
result += sheet.getRange(i + set_num - 1, 2).getValue() + "\n";
}
SpreadsheetApp.getUi().alert(result); // 訳の部分を表示
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment