第551話:週報スプレッドシートへのコメント

2017年9月4日


業務:週次売上報告へのフィードバック

「一週間分の売上」が Google Sheets に書き込まれるようになった。(参照:第550話

全店長が一つのファイル(例:『売上報告2017-08-27to2017-09-02』)を同時編集するので、
  • 各店長は他店を意識するようになった
  • 店長同士で誤入力を指摘し合うようになった
  • 本部での集計作業は(Spreadsheet任せなので)不要になった
  • 役員達もファイルを閲覧し、各店舗の動向を能動的に確認するようになった
などのカイゼンが図られている。つまり、各店長のコメントを含む「売上データ」が、社内でイキイキと活用されるようになった。(これまでは「売上データ」が死んでいた?)

課題:管理職側のコメントがない

しかし、本部マネージャから全店長に「フィードバック」があっても良いのではないだろうか?

セッカク全店長が頑張って報告してくれているのに、本部のマネージャ達から何も感想がないのは寂しい。「目標達成を頼む」の一言でもイイ。マネージャの笑顔を待ちわびる店長達に伝えてやってくれ。。。

そうすれば「実績データについて本部のマネージャ達がどう考えているか/どんな助言をしているのか」を役員達が知ることもできる。

[週次売上報告プロセス-フィードバック]



解決:フィードバック工程の設置と SpreadSheet への自動書込

ヒューマン工程『2.コメント』を下流工程に設置すれば、エリアマネージャに対して「フィードバックを行う業務」を追加することが可能です。

この業務プロセス定義では、2人のエリアマネージャに対して「コメント業務」が追加されます。すなわちワークフロー基盤(Questetra等)で毎週「フィードバック」を記入することになります。

さらにこの例では、メール送信イベント『店長通知』と自動工程『Sheet書込』も併せて設置されています。すなわち、記入された「フィードバック」は店長達にメールで自動通知されるとともに、当該 Spreadsheet にも自動的に保存されます。(二度手間の回避)

考察:Google Sheets API をワークフローから呼び出す

Google Sheets に対して、より複雑な「ファイル操作」をリクエストさせたい場合には、サービス工程の定義ファイルを自作する必要があります。

#この例では、パッケージ化された「サービス工程アドオン:Google Spreadsheets セル値の更新」によって『Sheet 書込』が配置されているので、API やプログラミングについての知識は不要です。すなわち、プロセスオーナーはテンプレートとなる Spreadsheet ファイルを作成し、そのIDをプロセスモデラ内で設定するだけで、「業務システム」を構築することができます。

Google Sheets 自身が「spreadsheetsファイル > 複数のSheets > セルのValues」というデータ管理構造をもつため、API の呼び出しについては、その操作内容に応じて最適な API マニュアルを参照する必要があります。


この例では「Collection: spreadsheets.values」が利用されていますが、データの一括削除やデータの一括参照といった操作は、「Collection: spreadsheets」に位置づけられている「Method: spreadsheets.batchUpdate」が非常にパワフルで有用といえます。

たとえば、『Google Sheet 2列データの一括取得』『Google Sheets 行追加 (TSV)』といった「サービス工程アドオン」では「Method: spreadsheets.batchUpdate」が活用されています。

<定義ファイルのサンプル:Google Spreadsheets セル値の更新>
  1. <?xml version="1.0" encoding="UTF-8"?><service-task-definition>
  2.  
  3. <label>Google Spreadsheets value update</label>
  4. <label locale="ja">Google Spreadsheets セル値の更新</label>
  5.  
  6. <summary>1. Get Secret: https://console.developers.google.com/apis/dashboard
  7. 2. Config [OAuth 2.0 Setting] (scope) https://www.googleapis.com/auth/spreadsheets
  8. </summary>
  9.  
  10. <help-page-url>https://www.questetra.com/tour/m4/m415/addon-googlespreadsheets-value-update/</help-page-url>
  11. <help-page-url locale="ja">https://www.questetra.com/ja/tour/m4/m415/addon-googlespreadsheets-value-update/</help-page-url>
  12.  
  13. <configs>
  14. <config name="conf_OAuth2" required="true" form-type="TEXTFIELD">
  15. <label>A: Set OAuth2 Config Name (at [OAuth 2.0 Setting])</label>
  16. <label locale="ja">A: OAuth2通信許可設定名 (←[OAuth 2.0 設定])</label>
  17. </config>
  18. <config name="conf_DataIdB" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD|SELECT_SINGLE">
  19. <label>B: Select STRING/SELECT DATA for Spreadsheet ID</label>
  20. <label locale="ja">B: Spreadsheet ID が格納されている文字列型or選択肢型データを選択してください</label>
  21. </config>
  22. <config name="conf_DataIdC" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD|SELECT_SINGLE">
  23. <label>C: Select STRING/SELECT DATA for Sheet Title</label>
  24. <label locale="ja">C: Sheet の名前が格納されている文字列型データor選択肢型データを選択してください</label>
  25. </config>
  26. <config name="conf_DataIdD" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD|SELECT_SINGLE">
  27. <label>D: Select STRING/SELECT DATA for Cell Coordinate (e.g. "A1")</label>
  28. <label locale="ja">D: 更新セルの座標が格納されている文字列型or選択肢型データを選択してください (例 "A1")</label>
  29. </config>
  30. <config name="conf_DataIdE" required="true" form-type="SELECT" select-data-type="STRING|SELECT_SINGLE|DECIMAL|DATE|DATETIME|QUSER|QGROUP">
  31. <label>E: Select DATA ITEM for Stored Value</label>
  32. <label locale="ja">E: セルを更新するデータが格納されているデータ項目を選択してください</label>
  33. </config>
  34. <config name="conf_DataIdX" required="false" form-type="SELECT" select-data-type="STRING_TEXTAREA">
  35. <label>X: Select STRING DATA for Access Log (update)</label>
  36. <label locale="ja">X: 通信ログが格納される文字列型データを選択してください (更新)</label>
  37. </config>
  38. </configs>
  39.  
  40.  
  41. <script><![CDATA[
  42. // Google Spreadsheets Value Update via Sheets API v4 (ver. 20170828)
  43. // (c) 2017, Questetra, Inc. (the MIT License)
  44.  
  45. ////// == 工程コンフィグの参照 / Config Retrieving ==
  46. var oauth2 = configs.get( "conf_OAuth2" ) + "";
  47. // Convert from 'java.lang.String' to 'JavaScript string' by '+""'
  48. var dataIdB = configs.get( "conf_DataIdB" ) + ""; // Data Identification Number (e.g. "9")
  49. var dataIdC = configs.get( "conf_DataIdC" ) + "";
  50. var dataIdD = configs.get( "conf_DataIdD" ) + "";
  51. var dataIdE = configs.get( "conf_DataIdE" ) + "";
  52. var dataIdX = configs.get( "conf_DataIdX" ) + "";
  53.  
  54. ////// == ワークフローデータの参照 / Data Retrieving ==
  55. var fileId = ""; // e.g. "1PEZ5KEZc0RkUn7AbAe2lYaHXzbJ9jnZ2swIWPszRz6U"
  56. if( engine.findDataDefinitionByNumber( dataIdB ).matchDataType( "STRING_TEXTFIELD" ) ){
  57. fileId = data.get( dataIdB ) + ""; // convert to JavaScript string
  58. }else if( engine.findDataDefinitionByNumber( dataIdB ).matchDataType( "SELECT_SINGLE" ) ){
  59. fileId = data.get( dataIdB ).get(0).getValue() + "";
  60. }
  61. var sheetTitle = ""; // e.g. "Sheet1"
  62. if( engine.findDataDefinitionByNumber( dataIdC ).matchDataType( "STRING_TEXTFIELD" ) ){
  63. sheetTitle = data.get( dataIdC ) + "";
  64. }else if( engine.findDataDefinitionByNumber( dataIdC ).matchDataType( "SELECT_SINGLE" ) ){
  65. sheetTitle = data.get( dataIdC ).get(0).getValue() + "";
  66. }
  67. var cellCoordinate = ""; // e.g. "A1"
  68. if( engine.findDataDefinitionByNumber( dataIdD ).matchDataType( "STRING_TEXTFIELD" ) ){
  69. cellCoordinate = data.get( dataIdD ) + "";
  70. }else if( engine.findDataDefinitionByNumber( dataIdD ).matchDataType( "SELECT_SINGLE" ) ){
  71. cellCoordinate = data.get( dataIdD ).get(0).getValue() + "";
  72. }
  73. var updateValue = "";
  74. if( engine.findDataDefinitionByNumber( dataIdE ).matchDataType( "SELECT_SINGLE" ) ){
  75. updateValue = data.get( dataIdE ).get(0).getValue() + "";
  76. }else{
  77. updateValue = data.get( dataIdE ) + "";
  78. }
  79.  
  80. ////// == 演算 / Calculating ==
  81. // preparing for API Request
  82. var apiRequest = httpClient.begin(); // HttpRequestWrapper
  83.  
  84. // preparing for API Request (OAuth2 Access Token)
  85. var token = httpClient.getOAuth2Token( oauth2 );
  86. apiRequest = apiRequest.bearer( token );
  87.  
  88. // preparing for API Request (Path parameters)
  89. var apiUri = "https://sheets.googleapis.com/v4/spreadsheets/";
  90. apiUri += fileId + "/values/" + sheetTitle + "!" + cellCoordinate;
  91.  
  92. // preparing for API Request (Query parameters)
  93. apiRequest = apiRequest.queryParam( "valueInputOption", "USER_ENTERED" );
  94.  
  95. // preparing for API Request (JSON Body)
  96. var requestObj = {};
  97. requestObj.values = [];
  98. requestObj.values[0] = [];
  99. requestObj.values[0][0] = updateValue;
  100. apiRequest = apiRequest.body( JSON.stringify( requestObj ), "application/json" );
  101.  
  102. // PUT Request to the API
  103. var response = apiRequest.put( apiUri ); // HttpResponseWrapper
  104. var statusCode = response.getStatusCode() + "";
  105. var accessLog = "";
  106. accessLog += "---PUT request--- " + statusCode + "\n";
  107. accessLog += response.getResponseAsString() + "\n";
  108.  
  109. // Retrieve Properties from Response-JSON
  110. // (no action)
  111.  
  112. ////// == ワークフローデータへの代入 / Data Updating ==
  113. if( dataIdX !== "" ){
  114. retVal.put( dataIdX, accessLog );
  115. }
  116. ]]></script>
  117.  
  118.  
  119. <icon>
  120. iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACuUlEQVRYR82X0VHbQBCGd8UT8BA6iFMBTgXxIwjP4A4SKoBUEFNBTAU4HTgz6PCjqCCkgpAOnBf5Sfdnfs3JcxKSLBmUyc34wZLu9t/d2+/2VFqMk5OTwd7e3gcRGfIHYKCqA38qgCdVfRKRR/7SNH1YLpf83zi06W0Yhp9E5FJVabjzAPCoqrMoir7VTa4UMB6PR9ba27KXnRW4CYxOEAQXd3d3cXmNZwLotare7mqsaR6AC2PM3P+mIMDl+lcfxvM10zR95++NgoCzs7MrEfnapwAR+RxF0Sy3URDQZ/hzg+U0FASMRqOjg4MDltObPqIA4E+SJIM4jleVEeBDV3qz1xZB40EQTMqVUFmGYRiy7imC8HnxAPAgIlfGGEKqMBpBdHp6OlFVluX5LioAfAcwv7+/X7QCEasAAIwxN/4E7o39/f2RIyKjc8T3eYSch3zE3D6SgOv1OvZz7dI7VdVVUxXwgy+O69MmhLaNCMUfHh6eA7iiAwCujTHTujLMBHiLrwAwfAtr7c82h4vzdKiqxwAYtUkeMb7rKqDK0YznALJwu1SMvA83Kaqa/BoC2ka/7rtGEjJ0P15qoWk+gPd+OVadhqz/yz5EALgxxvC82Yw6EL26iCrj2f6p89TRkFWxE4TydQkjEZlWUfCZAJKvDBD2CEEQcJeznLhH3m7J8W9XHYskSRY+jLgWWeCTsXwc0+NLALMkSW7KJMsNMzpBEGQ0zIe1dlXnpTtl2VuStNwHrUC0gZAxhmHsPFxv+dGH0a4cyKGTtdzW2sp2W1VJPkaGMPLhtBG/q4DO3tdN+L8F/IumtLEndCXH20xvPaG1dljbljNvfXbGWy8m+cZx5TPfBp22OxMA4TTp3BO6aPDwOG5rzP/OtWrz8nVs62FUNubhOLueiwiRWkCy83JzPbfWxm06qL/sgpkwsGVshgAAAABJRU5ErkJggg==
  121. </icon>
  122.  
  123. </service-task-definition>

[週次売上報告プロセス-フィードバック:「2a.コメント」画面]

<データ項目一覧画面>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿