Created
November 14, 2016 03:36
-
-
Save githubmorley/46b5fd79d86d0246c6adec620f282aad to your computer and use it in GitHub Desktop.
Googleスプレッドシート_翻訳支援
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
// 起動時処理:スプレッドシートのメニューに追加 | |
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