×

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


Googleを追いかけろ!

.

チュートリアル 上級者 3-2: 経費報告書の承認

  • スプレッドシートとFormを利用してワークフローアプリケーションを作成するステップです。 従業員が上司に経費報告をしたの後、承認または却下の通知が従業員に確認できる一連の流れを実現します。完成には20分ほどかかります。

    getRowsData 関数については 2-1.スプレッドシートの読み取りで扱っています。

    Google Formsについて

§1 Expense Report Form(経費報告書) をセットする

§2 Approval Form(承認書) をセットする

§3 スプレッドシートへの適応

§4 サンプルスクリプトの実行

§5 コメント付き完成コード

§6 改良

チュートリアル 上級者/目次 参照ページ(Goolge)


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


§1Expense Report Form(経費報告書) をセットする

  1. スプレッドシート用テンプレートを取得します。 テンプレートの取得
  2. ファイルメニューから自分用のコピーを作成してください。
  3. Form menu から Go to live form を用いて経費報告をします。自分のメールアドレスと上司のメールアドレスも入れましょう。
下のようになってればOKです。
このスプレッドシートには以下のものが含まれています。
  • ユーザーによって送信された経費報告書
  • ワークフォローの状態情報はState 列のスクリプトによって保守される

§2 (承認書) をセットする

  1. フォーム用テンプレートを取得します。 テンプレートの取得
  2. ファイルメニューから自分用のコピーを作成してください。
  3. まだ送信しないでください。
下のようになってればOKです。
このシートには経費報告書に対してマネージャーが承認または却下した結果が表示されます。

§3 練習 : スプレッドシートへの適応

  1. 【Script Editor】から Expense Report Spreadsheet(経費報告書) を開きます。(the Approvals Spreadsheet - 承認書)ではありません。 そこにある上から2行コードにあるAPPROVALS_SPREADSHEET_IDAPPROVAL_FORM_URLはこのチュートリアルを始める前の更新を実行しています。
  2. Approvals Spreadshee(Expense report - 経費報告書ではありません) のidに 貴方の作成したAPPROVALS_SPREADSHEET_ID定数をセットします。 もし作成したスプレッドシートのURLが https://spreadsheets.google.com/a/yourdomain.com/ccc?key=rdkapM1ai4DGQ56B08z45g ならば、idは rdkapM1ai4DGQ56B08z45g です。
  3. 承認フォームのURLに対するAPPROVAL_FORM_URLの定数をセットします。Approvals Spreadsheet上のメニューでForm → live formとたどってフォームを開いてそのURLをコピーしてください。

§4 サンプルスクリプトの実行

経費報告書を送信する従業員、承認または却下する上司、スプレッドシートの所有者かつ管理者でスクリプトの保守をする3人について話をします。 テストでは3人の役割をあなた一人でします。

Google Apps Script はまだ onFormSubmit event をサポートしていません。そこで、新たな経費報告書とその回答を処理するスクリプトの実行は管理者で無ければなりません。 ツールの Notification rules で通知報告を利用してください。

  1. 管理者として 【Code Editor】onReportOrApprovalSubmit を手動で実行します。あなたの経費報告書に対して経費報告書スプレッドシートの State列が MANAGER_EMAIL と表示が変わるのを確認してください。
  • 貴方宛に送られてきた経費報告書を上司であるあなたに通知するメールを受信します。この報告書には個別のIDと承認書フォームへのリンクが付けられています。
    1. ここも上司としてです。メール上のフォームへのリンクをクリックして報告書メールにあるIDと承認か却下のいずれかをフォームに入力します。 承認書シートは以下のようになります。
    1. 更に上司としてもう一度 onReportOrApprovalSubmit を実行します。経費報告書シートの State 列があなたの報告に対して APPROVED または DENIED に変更されていることを確かめてください。
    1. 従業員としてのあなたへ提出した経費報告書に対して上司からの承認または却下の回答とコメントのあるメールを受信したことの確認がきます。

    §5 コメント付き完成コード

    var APPROVALS_SPREADSHEET_ID = "INSERT_YOUR_OWN_HERE";
    var APPROVAL_FORM_URL = "INSERT_YOUR_OWN_HERE";
    var STATE_MANAGER_EMAIL = "MANAGER_EMAIL";
    var STATE_APPROVED = "APPROVED";
    var STATE_DENIED = "DENIED";
    var COLUMN_STATE = 6;
    var COLUMN_COMMENT = 7;
    
    // Main tutorial function:
    // For each row (expense report):
    //   - if it's new, email the report to a manager for approval
    //   - if it has recently been accepted or denied by a manager, email the results to the employee
    //   - otherwise (expense reports that have already been fully processed or old expense reports 
    //     that still have not been approved or rejected), do nothing
    // Ideally, this function would be run every time the Approvals Spreadsheet or the Expense Report
    // Spreadsheet are updated (via a Form submission) or regularly (once a day).
    function onReportOrApprovalSubmit() {
      // This is the Expense Report Spreadsheet
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheets()[0];
    
      // Also open the Approvals Spreadsheet
      var approvalsSpreadsheet = SpreadsheetApp.openById(APPROVALS_SPREADSHEET_ID);
      var approvalsSheet = approvalsSpreadsheet.getSheets()[0];
    
      // Fetch all the data from the Expense Report Spreadsheet
      // getRowsData was reused from Reading Spreadsheet Data using JavaScript Objects tutorial
      var data = getRowsData(sheet);
    
      // Fetch all the data from the Approvals Spreadsheet
      var approvalsData = getRowsData(approvalsSheet);
    
      // For every expense report
      for (var i = 0; i < data.length; ++i) {
        var row = data[i];
        row.rowNumber = i + 2;
        if (!row.state) {
          // This is a new Expense Report.
          // Email the manager to request his approval.
          sendReportToManager(row);
          // Update the state of the report to avoid email sending multiple emails
          // to managers about the same report.
          sheet.getRange(row.rowNumber, COLUMN_STATE).setValue(row.state);
        } else if (row.state == STATE_MANAGER_EMAIL) {
          // This expense report has already been submitted to a manager for approval.
          // Check if the manager has accepted or rejected the report in the Approval Spreadsheet.
          for (var j = 0; j < approvalsData.length; ++j) {
            var approval = approvalsData[j];
            if (row.rowNumber != approval.expenseReportId) {
              continue;
            }
            // Email the employee to notify the Manager's decision about the expense report.
            sendApprovalResults(row, approval);
            // Update the state of the report to APPROVED or DENIED
            sheet.getRange(row.rowNumber, COLUMN_STATE).setValue(row.state);
            break;
          }
        }
      }
    }
    
    // Sends an email to an employee to communicate the manager's decision on a given Expense Report.
    function sendApprovalResults(row, approval) {
      var approvedOrRejected = (approval.approveExpenseReport == "Yes") ? "approved" : "rejected";
      var message = ""
        + "

    " + approval.emailAddress + " has " + approvedOrRejected + " your expense report." + "

    Amount: $" + row.amount + "

    Description: " + row.description + "

    Report Id: " + row.rowNumber + "

    Manager's comment: " + (approval.comments || "") + "

    "; MailApp.sendEmail(row.emailAddress, "Expense Report Approval Results", "", {htmlBody: message}); if (approval.approveExpenseReport == "Yes") { row.state = STATE_APPROVED; } else { row.state = STATE_DENIED; } } // Sends an email to a manager to request his approval of an employee expense report. function sendReportToManager(row) { var message = "" + "

    " + row.emailAddress + " has requested your approval for an expense report." + "

    " + "Amount: $" + row.amount + "

    " + "Description: " + row.description + "

    " + "Report Id: " + row.rowNumber + '

    Please approve or reject the expense report here.' + ""; MailApp.sendEmail(row.managersEmailAddress, "Expense Report Approval Request", "", {htmlBody: message}); row.state = STATE_MANAGER_EMAIL; }

    §6 改良

    Expense ReportApprovalシートへのエントリーを減らせるようなちょっとしたコードもあります。データ量が大きいときには スクリプトの実行速度を速くできます。現在のスクリプトでは、それぞれのスプレッドシートの最初のシートから読み始めるので、データは 2番目のシート、他のスプレッドシート・・・と移動せざるを得ません。




      * チュートリアル 上級者/目次
      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-2. 経費報告書の承認 : end -- 2011/10/30