1

私はスポーツチームを指導し、そのウェブサイトを立ち上げました。管理ページにボタンを追加して、クリックしてチームの全員にメールをすばやく送信したいと考えています。このメールには、「今日のスケジュールが変更されました。詳細については、ウェブサイトにアクセスしてください」のような内容が記載されています。

これは Outlook の配布リストなどで簡単に実現できると思いますが、Google Apps Script を使用して理解を深めたいと考えています。

メールアドレスとメールを送信する簡単なスクリプト関数を含む Google スプレッドシートがあります。

これは、スクリプト エディター内でクリックして実行するとうまく機能しますが、ボタンと JavaScript を使用して外部 Web サイトからこれを呼び出す方法はありますか?

4

3 に答える 3

2

サイトに埋め込むことができる Google UI オブジェクトを作成する必要があります。これを行うには、Web アプリとしてデプロイするスクリプトを作成します。( Google Apps Script - Web Appsを参照してください。) そのオブジェクトには、既存のスクリプト関数を呼び出して電子メールを送信するボタンが含まれます。

Web アプリを公開して、ユーザーとして実行します。特定の状況では、アプリへのアクセスを自分に限定したい場合もあります。これは、作成した UI Blob が一般向けに機能しないことを意味します。これは非常に不完全ですが、スクリプトをトリガーする 1 つのボタンを含む BLOB を生成します。

function doGet() {
  var app = UiApp.createApplication();

  var button = app.createButton('Send Schedule Change Email');
  app.add(button);

  var handler = app.createServerHandler('myClickHandler');
  button.addClickHandler(handler);

  return app;
}

function myClickHandler(e) {
  var app = UiApp.getActiveApplication();

  // Call your library function, e.g.
  TeamSpreadsheet.sendScheduleChanged();

  var label = app.createLabel('Message Sent')
                 .setId('statusLabel')
                 .setVisible(false);

  label.setVisible(true);

  app.close();
  return app;
}

Web アプリは、スプレッドシートに埋め込まれていると思われる既存のスクリプトにアクセスできる必要があります。これを行うには、最初に既存のスクリプトのバージョンを保存し ([ファイル] - [バージョンの管理])、それをライブラリとして新しい Web アプリ スクリプトに追加します ([リソース] - [ライブラリの管理])。ライブラリの詳細については、こちらをご覧ください。Web アプリはユーザーとして実行されるため、スプレッドシートをプライベートに保つことができます。

注意事項

ライブラリ内のユーティリティ スクリプトは、シートの外部から機能する方法でスプレッドシートを開く必要があります。SpreadsheetApp.getActiveSpreadsheet()ではなく、 SpreadsheetApp.openById() を使用してください。残念ながら、openById を使用してホスト スプレッドシートを開くと、puke が発生するため、次のようなものが必要になります。

  var ss = null;
  try {
    // This works for scripts running in the host spreadsheet
    ss = SpreadsheetApp.getActiveSpreadsheet();
  } catch(err) {
    try {
      // This works for web apps
      ss = SpreadsheetApp.openById("SPREADSHEET ID");
    } catch(err) {
      Logger.log("Could not open source spreadsheet.");
      // Well, then, not much sense carrying on, is there?
      return;
    }
  }
  SpreadsheetApp.setActiveSpreadsheet(ss);
  ...

実際、「アクティブな」オブジェクトから情報を取得するための呼び出しへの依存に注意してください。それらを回避するには、体操をする必要があるかもしれません。

ライブラリ ルーチンをトレースしようとすると、app-script デバッガーが「サーバー エラー」を報告することが多いため、この種の配置のデバッグは苦痛であることがわかりました。

始めるのに役立つことを願っています!

于 2012-12-13T21:27:47.200 に答える
1

Mogsdad の回答 (非常に完全で興味深いものでした) を補完するものとして、既に動作するスクリプトがあるため、ケースは少し単純になる可能性があると言えます。

スクリプトをdoGet()使用して、Mogsdad の例のような関数を追加し、メールを送信するために作成した既存の関数を呼び出すハンドラーをボタンに定義します。この関数でgetActiveSpreadsheet()bySpreadsheetApp.OpenById("the ID of the SS")getActiveSheet()byを置き換えれOpenByName()ば、変更は完了です。

その後、Mogsdad の指示に従います。スクリプトを Web アプリケーションとして実行し、提供された URL を使用してサイトのリンクからアクセスします。

リスクを冒したくない場合は、元のスプレッドシートのコピーに対してこれらすべての変更を行い、作業モデルを常に手元に置いておいてください。より正確なアドバイスが必要な場合 (または問題が発生した場合) は、既存のスクリプトを表示して、変更に関するヘルプを取得してください。

PS : これは簡単なコメントと考えてください。書式設定を快適にするために回答に書かれています。

于 2012-12-13T22:31:13.820 に答える