pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


Google Apps Script でユーザの言語設定に合わせてメッセージを変える

Google Apps Script でGoogle Spreadsheetに追加メニューを表示させる際に、言語設定によってメッセージを変えたくなったため、方法を調べてみました。

ユーザの言語設定は Session.getActiveUserLocale() で取得できる。

細かい説明はこちらにありますが、Session.getActiveUserLocale() でユーザーの言語設定を取得できます。英語設定の場合は en が返されるそうです。

developers.google.com

メニューを英語、日本語の両対応にする

とりあえず、次のように実装すれば、日本語設定されていればは日本語メニューを追加し、それ以外の場合は英語メニューを追加します。

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() に渡してやれば、任意の言語に翻訳したメニューを生成できそうです。

developers.google.com

この場合は次のような実装になり、言語ごとの分岐は不要です。

ただし自動翻訳は品質がイマイチのこともありますので、適切に表示したい言語については個別実装し、それ以外の言語は自動翻訳に任せる、という使い分けは十分にアリです。

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 のオーナーがシートを開いた場合だけ発火するようです。この方法で追加メニューを実装しても、オーナー以外の方が閲覧する分にはメニューの追加は行われません。