Google Apps Script でGoogle Spreadsheetに追加メニューを表示させる際に、言語設定によってメッセージを変えたくなったため、方法を調べてみました。
ユーザの言語設定は Session.getActiveUserLocale() で取得できる。
細かい説明はこちらにありますが、Session.getActiveUserLocale() でユーザーの言語設定を取得できます。英語設定の場合は en が返されるそうです。
メニューを英語、日本語の両対応にする
とりあえず、次のように実装すれば、日本語設定されていればは日本語メニューを追加し、それ以外の場合は英語メニューを追加します。
function onOpen() { var userLocale = Session.getActiveUserLocale(); var menuName; var menuEntries; if ( userLocale == "ja" ) { menuName = "追加メニュー"; menuEntries = [ { name : "メニュー項目1", functionName: "menuItem1" } ]; } else { menuName = "Additional Menu"; menuEntries = [ { name : "menuItem1", functionName: "menuItem1" } ]; } SpreadsheetApp.getActiveSpreadsheet().addMenu(menuName, menuEntries); } function menuItem1() { ...... }
メニュー項目に自動翻訳を設定してすべての言語に対応させる
Session.getActiveUserLocale() の戻り値が en, ja などで返されるならば、その戻り値を LanguageApp.translate() に渡してやれば、任意の言語に翻訳したメニューを生成できそうです。
この場合は次のような実装になり、言語ごとの分岐は不要です。
ただし自動翻訳は品質がイマイチのこともありますので、適切に表示したい言語については個別実装し、それ以外の言語は自動翻訳に任せる、という使い分けは十分にアリです。
function onOpen() { var userLocale = Session.getActiveUserLocale(); var menuName; var menuEntries; menuName = LanguageApp.translate( "追加メニュー", "ja", userLocale ); menuEntries = [ { name : LanguageApp.translate( "メニュー項目1", "ja", userLocale ), functionName: "menuItem1" } ]; SpreadsheetApp.getActiveSpreadsheet().addMenu(menuName, menuEntries); } function menuItem1() { ...... }
ただし、onOpen() イベントは Spreadsheet のオーナーがシートを開いた場合だけ発火するようです。この方法で追加メニューを実装しても、オーナー以外の方が閲覧する分にはメニューの追加は行われません。