iframe サンドボックス モードに移行する

Apps Script は、セキュリティ サンドボックスを使用して、特定の状況において Google Workspaceアプリケーションを保護して隔離します。IFRAME を除くすべてのサンドボックス モードのサポートが終了しました。古いサンドボックス モードを使用するアプリは、自動的に新しい IFRAME モードを使用するようになりました。

以前にこれらの古いモードを HTML Service で使用していたアプリは、以下の違いに対応するために IFRAME モードに変更を加える必要がある場合があります。

  • target="_top" または target="_blank" を使用して、リンクの target 属性をオーバーライドする必要があります。
  • HTML サービスによって配信される HTML ファイルには、<!DOCTYPE html>、<html>、<body> タグを含める必要があります。
  • Google ネイティブ ローダー ライブラリ api.jsIFRAME モードでは自動的に読み込まれない
  • Picker のユーザーは、コンテンツが新しいドメインから提供されるため、setOrigin() を呼び出す必要があります。
  • IE9 などの古いブラウザはサポートされていません。
  • インポートされたリソースで HTTPS を使用する必要があります
  • フォームの送信がデフォルトで防止されなくなりました

これらの違いについては、次のセクションで詳しく説明します。

IFRAME モードでは、リンク ターゲット属性を _top または _blank に設定する必要があります。

Code.js

function doGet() {
  var template = HtmlService.createTemplateFromFile('top');
  return template.evaluate();
}

top.html

<!DOCTYPE html>
<html>
 <body>
   <div>
     <a href="http://google.com" target="_top">Click Me!</a>
   </div>
 </body>
</html>

この属性は、包含するウェブページの head セクション内で <base> タグを使用してオーバーライドすることもできます。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

トップレベルの HTML タグ

NATIVE(および EMULATED)サンドボックス モードでは、特定の HTML タグが Apps Script .html ファイルに自動的に追加されますが、IFRAME モードを使用している場合は行われません。

IFRAME を使用してプロジェクト ページが正しく配信されるようにするには、ページ コンテンツを次のトップレベル タグで囲みます。

<!DOCTYPE html>
<html>
  <body>
    <!-- Add your HTML content here -->
  </body>
</html>

ネイティブ JavaScript ローダ ライブラリを明示的に読み込む必要がある

ネイティブ ローダー ライブラリ api.js の自動読み込みに依存していたスクリプトは、次の例に示すように、このライブラリを明示的に読み込むように変更する必要があります。

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

Google Picker API の変更

Google Picker API を使用する場合は、PickerBuilder の作成時に setOrigin() を呼び出して、オリジンの google.script.host.origin を渡す必要があります。次の例をご覧ください。

function createPicker(oauthToken) {
  var picker = new google.picker.PickerBuilder()
      .addView(google.picker.ViewId.SPREADSHEETS) // Or a different ViewId
      .setOAuthToken(oauthToken)
      .setDeveloperKey(developerKey)
      .setCallback(pickerCallback)
      .setOrigin(google.script.host.origin) // Note the setOrigin
      .build();
  picker.setVisible(true);
}

完全な動作例については、ファイルを開くダイアログをご覧ください。

ブラウザ サポート

IFRAME サンドボックス モードは、HTML5 の iframe サンドボックス機能に基づいています。Internet Explorer 9 などの一部の古いブラウザでは、この機能はサポートされていません。この問題は、Apps Script プロジェクトで次の両方の条件を満たす場合に発生することがあります。

  • HtmlService を使用する、かつ
  • 以前に使用した EMULATED または NATIVE のサンドボックス化

このようなアプリを IFRAME サンドボックス モードに移行すると、HTML5 の iframe サンドボックス機能をサポートしていない一部の古いブラウザ(特に IE9 以前)で動作しなくなる可能性があります。

すでに IFRAME モードをリクエストしているアプリや、HtmlService をまったく使用していないアプリには、この問題による影響はありません。

インポートされたリソースには HTTPS が必要になりました

HTTP を使用してリソースをインポートしていた以前のアプリケーションは、HTTPS を使用するように変更する必要があります。

フォームの送信がデフォルトで防止されなくなりました

NATIVE のサンドボックス化では、HTML フォームが実際にページを送信したり、ページを移動したりすることができなくなりました。そのため、デベロッパーは送信ボタンに onclick ハンドラを追加するだけで、その後の処理を気にする必要がなくなります。

ただし、IFRAME モードでは HTML フォームの送信が可能であり、フォーム要素に action 属性が指定されていない場合は空白ページに送信されます。また、onclick ハンドラが終了する前に、内部 iframe が空白のページにリダイレクトされる場合もあります。

この問題を解決するには、フォーム要素が実際に送信されないようにする JavaScript コードをページに追加して、クリック ハンドラが機能する時間を確保します。

<script>
  // Prevent forms from submitting.
  function preventFormSubmit() {
    var forms = document.querySelectorAll('form');
    for (var i = 0; i < forms.length; i++) {
      forms[i].addEventListener('submit', function(event) {
        event.preventDefault();
      });
    }
  }
  window.addEventListener('load', preventFormSubmit);
</script>

詳細な例については、HTMLService ガイドのクライアントからサーバーへの通信をご覧ください。