×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


Googleを追いかけろ!

.

チュートリアル 上級者 3-6: Help Desk Workflow


WWW を検索 Googleを追いかけろ! を検索


§1 フォームを用いて自動的に承認メールを送る

  1. このスプレッドシートを開いてコピーしてください。。 7つのたて列 Timestamp, Description, Urgency, Contact email, Notes, Status, Resolution を確認します。これで受付番号を管理します。 はじめの4列はユーザーが行うフォーム入力でも一般的なものです。リクエストの情報を最後の3列に入力します。
  2. 新しいユーザーからのリクエストが来たときにメールを送信するスクリプトを付け加えます。【Script editor】を開いてください。
  3. 下のコードを貼り付けて保存します。ファイル名は Help Desk とでもして下さい。
function formSubmitReply(e) {
  var userEmail = e.values[3];
  MailApp.sendEmail(userEmail, 
                    "Help Desk Ticket", 
                    "Thanks for submitting your issue. \n\nWe'll start " +
                    "working on it as soon as possible. \n\nHelp Desk",                    
                    {name:"Help Desk"});
}
関数 formSubmitReplyevent handler になっているので、フォームへの応答があったときはいつでも呼び出されるように設定されています。 このイベントはパラメーター e としてあらゆるイベントへ渡されていきます。スプレッドシート上の on form submit イベントは e.values としてアクセスできますが、この値はユーザーがフォームを通じて送ってきたすべての値を含む配列になっています。値の配置はシートたて列にの配置に合致します。

formSubmitReply 関数は e.values からユーザーのメールアドレスを抽出します。そして MailApp.sendEmail を使いながらリクエストを受け取ったことを知らせるメールを送信します。 オプションですが、name という引数を使えば送信者が 'Help Desk' であることを知らせることができます。

  1. さて、フォームの応答が送信された時はいつもこの関数が呼ばれるようにするためのトリガー(きっかけ)を準備する必要があります。 【Script Editor】Triggers へ進み、さらに Current script's triggers と進みます。 'No triggers set up. Click here to add one now.' というリンクをクリックして下さい。

    表れたダイアログボックス3つのリストボックスがあります。ここでスクリプトを走らせるために 'formSubmitReply' を選択します。 'From spreadsheet' はイベントのタイプで、'On form submit' はイベントトリガーのためのものです。 では保存してください。

    1. 'Authorization required' 管理者権限を要求するダイアログが表れます。このダイアログはスクリプトがどんなデータやサービスにアクセスできるかを教えてくれるもので、 アクセスの許可や不許可が選べます。今回はスクリプトが送信を要求しているので許可します。
    2. サンプルのリクエストを実行してスクリプトを動作させてみましょう。スプレッドシートでフォームから Go to live form へと進みます。フォームの各フィールドと Contact email のフィールドにあなたのメールアドレスを入れて送信します。
    エントリーは下のようになりましたね。
    あなたにヘルプデスクから下のようなサンキューメールが届いているはずです。

    §2 受付番号とサポート順位を承認メールに入れる

    ユーザーのリクエストに対して簡単な確認メールを準備するする段階までが終わりました。これから、ユーザーにもっと情報を伝えるメールを送信するコードを作ります。 そこには受付番号とサポート順位のお知らせが入ります。

    まず、Bob がどのように受付番号を処理するのか見て見ましょう。新規の受付が発生すると 'Status' 列に'New' のマークを入れます。受付番号の処理に取り掛かると今度は 'In Progress' に変え、さらに完了したら 'Resolved にします。 'Note' 欄は問題に対する詳しい追加情報のために使われます。また’Resolution’列はどのように問題解決をしたかの詳しい追加情報です。

    1. F2 セルに'New' を入れて新規のリクエストを知らせます。その後を自動的に処理するためのコードを入れましょう。
    2. 【Script Editor】 で現在のコードを下のコードに入れ替えてください。

    function formSubmitReply(e) {
      var userEmail = e.values[3];
      var sheet = SpreadsheetApp.getActiveSheet();
      var lastRow = sheet.getLastRow();
      // Set the status of the new ticket to 'New'.
      // Column F is the Status column
      sheet.getRange("F" + lastRow).setValue("New");
      
      // Calculate how many other 'New' tickets are ahead of this one
      var numNew = 0;
      for (var i = 2; i < lastRow; i++) {
        if (sheet.getRange("F" + i).getValue() == "New") {
          numNew++;  
        }    
      }
      MailApp.sendEmail(userEmail, 
                        "Helpdesk Ticket #" + lastRow, 
                        "Thanks for submitting your issue. \n\nWe'll start " +
                        "working on it as soon as possible. You are currently " +
                        "number " +
                        (numNew + 1) + " in the queue. \n\nHelp Desk.",                    
                        {name:"Help Desk"});
    }
    
    この新しい formSubmitReply 関数は新規のリクエストが発生すると、アクティブシートの最終行を回収して Status 列(F列)に 'New' の値を入れます。 スクリプトは前の行の 'New' のステータスを持つ行番号を数え上げていきます。こうしてサポート順位の情報が手に入ることになります。 このときスクリプトはユーザーにメールを発信します。メールの件名欄には受付番号(シートの行番号に基ずく)とサポート順位が挿入されることになります。
    1. では、さっそくフォームの Go to live form から新規のリクエストをしてみましょう。
    スプレッドシートの最新エントリーの Status 列に 'New'の文字が見つかるでしょう。
    さらに、受付番号とサポート順位の挿入されたメールがヘルプデスクから届きます。

    §3 自動配信後に受付番号を更新する

    Bob はこれでカスタマイズした確認メールを送信できるようになりましたが、他の繰り返しの多い作業も自動化したいのです。 受付番号が更新されてからユーザーへ送信するところまでは、今のところまだ手動なのです。 更新が必要な都度シートから 'contact email', 'status', 'resolution' などの情報をメールに貼り付けなければなりません。 そこで、新しいメニューを追加します。選択されたユーザーのステータスを送信する機能です。
    1. 【Script Editor】 に下のコードに貼り付けてください。

    function emailStatusUpdates() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var row = sheet.getActiveRange().getRowIndex();
      var userEmail = sheet.getRange("D" + row).getValue();
      var subject = "Helpdesk Ticket #" + row;
      var body = "We've updated the status of your ticket.\n\nStatus: " + sheet.getRange("F" + row).getValue();
      body += "\n\nNotes: " + sheet.getRange("E" + row).getValue();
      body += "\n\nResolution: " + sheet.getRange("G" + row).getValue();
        
      MailApp.sendEmail(userEmail, subject, body, {name:"Help Desk"});  
    }
    
    function onOpen() {
      var subMenus = [{name:"Send Status Email", functionName: "emailStatusUpdates"}];
      SpreadsheetApp.getActiveSpreadsheet().addMenu("Help Desk Menu", subMenus);  
    }
    
    emailStatusUpdates 関数はシート上の現在アクティブな行番号を得ます。これはシート上のどの行を選択してでもです。 スクリプトは Contact email 列(D列)からユーザーのメールアドレスを回収してNotes,Status,Resolution(F,F,G列) それぞれの列の情報を含むメールを送信します。

    onOpen 関数 はsimple event handler の例ですが、Google Apps Script languageに組み込まれている型です。 ユーザーが編集のためにシートを開くと自動的にonOpen 関数が実行されます。この関数はシートのメニューバーに追加するのが良いと思います。 上のコードではのemailStatusUpdates関数 を呼び出す オプション として 'Help Desk Menu' をメニューバーに追加しています。

    1. onOpen イベントを誘発するためにシートを再読み込みしてください。 'Help Desk Menu' がメニューバーに追加されています。 例えば2行目、A2 セルを選択して 'Help Desk Menu' から 'Send Status Email' をクリックします。
    1. 受付番号上で status,notes,resolution の各項目の更新されたメールが届くはずです。

    §4 ユーザーとのアポイントをスケジューリングする

    時にはユーザーのリクエストに対してアポイントのスケジュール作成も必要になります。かつてはカレンダー(二人分)を見ながら互いに都合のよいに日時を探し出して案内状を作っていました。 しかし、こうなると仕事をやりくりするのにもう少しスクリプトを拡張したくなります。

    お互いのカレンダーから満足できる日付で、はじめの30分間の時間帯を探してアポイントのスケジューリングまで可能にするメニューを追加してみます。

    1. 現在の【Script Editor】のコードの下に scheduleAppointment 関数のコードを貼り付けます。

    function scheduleAppointment() {
      var apptDate = Browser.inputBox("Enter the date in MM/DD/YYYY format:");
      var sheet = SpreadsheetApp.getActiveSheet();
      var row = sheet.getActiveRange().getRowIndex();
      var userEmail = sheet.getRange("D" + row).getValue();
      
      var userCalendar = CalendarApp.getCalendarById(userEmail);
      var helpDeskCalendar = CalendarApp.getDefaultCalendar();
        
      // Find the first available 30 minute timeslot on the selected day
      // A "day" runs from 09:00 EDT to 17:00 EDT
      var startTime = new Date(apptDate + " 09:00 EDT");
      var endTime = new Date(apptDate + " 09:30 EDT");
      
      while (endTime.getTime() < new Date(apptDate + " 17:00 EDT").getTime()) {
        var numUserEvents = userCalendar.getEvents(startTime, endTime).length;
        var numHelpDeskEvents = helpDeskCalendar.getEvents(startTime, endTime).length;
        
        if (numUserEvents == 0 && numHelpDeskEvents == 0) {
          CalendarApp.createEvent("Help Desk appointment", startTime, endTime, 
                                 {description: "Help Desk Ticket #" + row,
                                 guests: userEmail}); 
          // Update Notes and Status (columns E and F) 
          sheet.getRange("E" + row).setValue("Appointment scheduled."); 
          sheet.getRange("F" + row).setValue("In Progress");       
          return;
        }
        // Add 30 minutes to start and end times
        startTime = endTime;
        endTime = new Date(startTime.getTime() + 30 * 60 * 1000);   
      }
      Browser.msgBox("There are no times available on " + apptDate + ". Please try another date.");
    }
    
    scheduleAppointment 関数の日にちの問い合わせの返答に対して、あなたとユーザーの両方のカレンダーを検討した結果をシート上の選択された行にします。 関数では勤務時間帯を9時から17時しているので不都合なら修正してください。二人の自由な時間帯で30分間が取れるはじめの日時を探します。 もし首尾よく見つかったら案内状が作られ、シート上の statusnotes が更新されます。見つからないときはもう一度希望日を入力します。
    1. 'Help Desk Menu'に新しいエントリーを加えるので onOpen 関数を下のコードと入れ替えます。

    function onOpen() {
      var subMenus = [{name:"Send Status Email", functionName: "emailStatusUpdates"},
                      {name:"Schedule Appointment", functionName: "scheduleAppointment"}];
      SpreadsheetApp.getActiveSpreadsheet().addMenu("Help Desk Menu", subMenus);   
    }
    
    1. onOpen を実行させるためにシートの再読み込みをして下さい。更新後 'Schedule Appointment''Help Desk Menu' に 追加されているのでこれを実行します。
    2. 日付を入れてみてその日の支障ない時間帯が見つかれば、自分とユーザー両方のカレンダーでアポイントを確かめることができます。

    §5 Google Sites でサポート技術情報を発行する

    省力化を進めるために Bobはサポート技術情報を Google Sites に発行することにしました。こうすればユーザーは 自分で【F&Q】から解決できるようになります。

    選択された解決方法の記述を Google Site に追加する新しいメニュを追加します。

    1. 最初に Google Site を作る必要があります。すでに Google Site のある方はそれを利用します。まだの人は こちらから 作ってください。 あなたの作るページのURLは https://sites.google.com/site/SITE_NAME とか https://sites.google.com/a/YOUR_DOMAIN/SITE_NAME みたいな感じになります。
    2. Google SiteCreate page ボタンをクリックして 'Select a template to use をへ行きます。 サイト名を 'kb'として Enter後 Put page at the top level というラジオボタンが選択されていることを確かめて Create page をクリックします。 次のページで Create a custom list ボタンを押して、Textカラムに Question or Issue""Resolution" の2つを作って保存します。
    3. 下の pushToKb 関数のコードを【Script Editor】上の現在のコードの下に貼り付けます。 SITE_NAMEYOUR_DOMAIN のところは自分のものに差し替えてください。

    function pushToKb() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var row = sheet.getActiveRange().getRowIndex();
      var site = SitesApp.getSite("site", "SITE_NAME");
      // Or, if you are a Google Apps user: 
      // var site = SitesApp.getSite("YOUR_DOMAIN", "SITE_NAME")
      var listPages = site.getListPages();
      for (var i = 0; i < listPages.length; i++) {
        if (listPages[i].getTitle() == "kb") {
          var columns = ["Question or Issue", "Resolution"];
          var values = [sheet.getRange("B" + row).getValue(),
                        sheet.getRange("G" + row).getValue()];
          site.createListItem("", columns, values, listPages[i]);
        }  
      }
    }
    

    pushToKb 関数は Google Site の現存するリスト中から "kb"名のあるサイトを探し出します。そして問題と解決の 記事をリストページに追加します。
    1. さて 'Help Desk Menu' にこの機能をエントリーさせましょう。現在【Script Editor】上のコードにある onOpen 関数を 下のものに入れ替えてください。

    function onOpen() {
      var subMenus = [{name:"Send Status Email", functionName: "emailStatusUpdates"},
                      {name:"Schedule Appointment", functionName: "scheduleAppointment"},
                      {name:"Push to KB", functionName: "pushToKb"}];
      SpreadsheetApp.getActiveSpreadsheet().addMenu("Help Desk Menu", subMenus);   
    }
    
    
    1. onOpen イベントを働かせるためにスプレッドシートを再読み込みします。'Help Desk Menu' の中に新規に 'Push to KB'が作られたので 'Push to KB' をクリックします。
    2. サポート技術情報ページを更新すると新しい Q&A が発行されています。

    最後にこのセクションの完成コードを掲載します。

    function formSubmitReply(e) {
      var userEmail = e.values[3];
      var sheet = SpreadsheetApp.getActiveSheet();
      var lastRow = sheet.getLastRow();
      // Set the status of the new ticket to 'New'.
      // Column F is the Status column
      sheet.getRange("F" + lastRow).setValue("New");
      
      // Calculate how many other 'New' tickets are ahead of this one
      var numNew = 0;
      for (var i = 2; i < lastRow; i++) {
        if (sheet.getRange("F" + i).getValue() == "New") {
          numNew++;  
        }    
      }
      MailApp.sendEmail(userEmail, 
                        "Helpdesk Ticket #" + lastRow, 
                        "Thanks for submitting your issue. \n\nWe'll start " +
                        "working on it as soon as possible. You are currently " +
                        "number " +
                        (numNew + 1) + " in the queue. \n\nHelp Desk.",                    
                        {name:"Help Desk"});
    }?
    
    function emailStatusUpdates() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var row = sheet.getActiveRange().getRowIndex();
      var userEmail = sheet.getRange("D" + row).getValue();
      var subject = "Helpdesk Ticket #" + row;
      var body = "We've updated the status of your ticket.\n\nStatus: " + sheet.getRange("F" + row).getValue();
      body += "\n\nNotes: " + sheet.getRange("E" + row).getValue();
      body += "\n\nResolution: " + sheet.getRange("G" + row).getValue();
        
      MailApp.sendEmail(userEmail, subject, body, {name:"Help Desk"});  
    }       
    
    function onOpen() {
      var subMenus = [{name:"Send Status Email", functionName: "emailStatusUpdates"},
                      {name:"Schedule Appointment", functionName: "scheduleAppointment"},
                      {name:"Push to KB", functionName: "pushToKb"}];
      SpreadsheetApp.getActiveSpreadsheet().addMenu("Help Desk Menu", subMenus);   
    }?
    
    function scheduleAppointment() {
      var apptDate = Browser.inputBox("Enter the date in MM/DD/YYYY format:");
      var sheet = SpreadsheetApp.getActiveSheet();
      var row = sheet.getActiveRange().getRowIndex();
      var userEmail = sheet.getRange("D" + row).getValue();
      
      var userCalendar = CalendarApp.getCalendarById(userEmail);
      var helpDeskCalendar = CalendarApp.getDefaultCalendar();
        
      // Find the first available 30 minute timeslot on the selected day
      // A "day" runs from 09:00 EDT to 17:00 EDT
      var startTime = new Date(apptDate + " 09:00 EDT");
      var endTime = new Date(apptDate + " 09:30 EDT");
      
      while (endTime.getTime() < new Date(apptDate + " 17:00 EDT").getTime()) {
        var numUserEvents = userCalendar.getEvents(startTime, endTime).length;
        var numHelpDeskEvents = helpDeskCalendar.getEvents(startTime, endTime).length;
        
        if (numUserEvents == 0 && numHelpDeskEvents == 0) {
          CalendarApp.createEvent("Help Desk appointment", startTime, endTime, 
                                 {description: "Help Desk Ticket #" + row,
                                 guests: userEmail}); 
          // Update Notes and Status (columns E and F) 
          sheet.getRange("E" + row).setValue("Appointment scheduled."); 
          sheet.getRange("F" + row).setValue("In Progress");       
          return;
        }
        // Add 30 minutes to start and end times
        startTime = endTime;
        endTime = new Date(startTime.getTime() + 30 * 60 * 1000);   
      }
      Browser.msgBox("There are no times available on " + apptDate + ". Please try another date.");
    }
    
    function pushToKb() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var row = sheet.getActiveRange().getRowIndex();
      var site = SitesApp.getSite("site", "SITE_NAME");
      // Or, if you are a Google Apps user: 
      // var site = SitesApp.getSite("YOUR_DOMAIN", "SITE_NAME")
      var listPages = site.getListPages();
      for (var i = 0; i < listPages.length; i++) {
        if (listPages[i].getTitle() == "kb") {
          var columns = ["Question or Issue", "Resolution"];
          var values = [sheet.getRange("B" + row).getValue(),
                        sheet.getRange("G" + row).getValue()];
          site.createListItem("", columns, values, listPages[i]);
        }  
      }
    }
    




      * チュートリアル 上級者/目次
      1. シンプルなメール統合 - フォームやスプレッドシートと特定されたメールの配信を結びつける
      2. 経費報告書の承認 -フォームやスプレッドシートを扱う上での簡単なワークフローアプリケーションの作成
      3. Google App Engine services - Google App Engineで構築されたウェブサービスと連携する
      4. ソープ IP Service に関して - サードパーティーのIP Geocoding service を呼び出すための Soap Service
      5. XML Document の構成要素の分析 - ウェブ上のソースをXML dataとしてパースする
      6. Help Desk Workflow - メール,フォーム,スプレッドシート,カレンダー,サイト等のhelp desk workflow 自動化
      7. Twitter用承認マネージャ - OAuth, MailApp, ScriptProperties, UiAppを利用したTwitter用承認マネージャ
      8. 予約アプリケーションの作成 - Ui Services in Apps Scriptを活用してGoogle Sitesに予約アプリケーションを作成
      -- チュートリアル 上級者 3-6. Help Desk Workflow : end -- 2011/10/30