第488話:クラウド会計と連携させる(その3)

2016年6月20日
エクセル向け CSV としてダウンロードできるボタンを設置する。(前回記事

会計システムにデータ投入しなければならない人の視点に立てば、その『Download ボタン』は極めて有効だ。いわゆる「仕訳伝票」のデータを Excel ファイル上に、サクサク追記していくことができる。「アル」と「ナイ」とでは、業務効率が大きく違う。日々の売掛金が、5分で入力されるか、1時間かけて入力されるか、運命の分かれ道・・・。

しかしそれでも、「Excel ファイルに追記する」という作業であるが故に、非常にクローズドな工程のままだ。たとえば、「最新ファイルは何処にあるのか?」、「その作業におけるコツはあるのか?」、「微修正が必要な場合のテクニックは?」などなど、工程に紐づくべきノウハウは俗人的なものになる可能性が高い。(ヌケモレ・コピーミス・不正といった事象発生リスクも気になる)


以下のワークフロー定義は、自動生成された複数の仕訳伝票データが Google SpreadSheets に自動追記される仕組みだ。(「MFクラウド会計」であれ、「Freee」であれ)、どんなクラウド型会計システムにデータ投入するにしても、『仕訳伝票』がクラウドで一元管理されていれば非常に便利だ。

ちなみに、そもそも、ワークフローに沢山の案件が流れ、それらの集計を行うべきは、ワークフローシステム側の仕事といえる。たとえば『案件一覧』は、各プロパティの総計や平均が集計される。しかし、各案件が「不定数の伝票」を生成するようなケースにおいては、その「伝票」を集計したい、といったニーズにはナカナカ応えづらい。その様な場合には『伝票一覧』というテーブルが別途用意されるべきだろう。

ここでは2016年5月に登場した「Sheets API v4」を使う。

[販売報告プロセス-スプレッドシート連携]

[販売報告プロセス-スプレッドシート連携:「3.記帳する」画面]

「API を使いこなす」のは大変だ。

しかし、今日「パソコンが使いこなされている」のと同じように、近い将来「API を使いこなす」のは多くのビジネスパーソンに必要なスキルとなるだろう。事実、「Facebook 投稿と Twitter 投稿を連動させる」といったシステム間の API 通信設定は、すでに多くの人が実体験するに至っている。


ちなみに Google Sheets API v4 は、その設計が v3 と大きく異なる。

> The Sheets API gives you full control over the content and appearence of your spreadsheet data.

と自身を表現しているように、きめ細かなレイアウト操作までできるようになっている。つまり「様々なレベルでの操作」ができるのだ。
ただ、シンプルに使いたい人にとっては、必要な API 情報を調べるのがタイヘンになったともいえるだろう。マニュアル(英語)を参照する場合は、(結局のところ)、「v3からv4への乗り換え」を参照する方が手っ取り早いケースもある。ちなみに v4 では「JSON ベースの REST API」が徹底されており、生産性の観点では非常に使いやすくなっている印象もある。

Sheets API は
  • spreadsheets
  • spreadsheets.sheets
  • spreadsheets.values
の大きく3つのレベルでアクセスすることができるが、このワークフロー例では「spreadsheets」の「batchUpdate」に対して「AppendCells」というリクエストが送られる設定だ。(←ナンダ、これは日本語か?)

▼ Google との OAuth2 通信設定のサンプル (メッセージ送信中間イベント)
POST: https://sheets.googleapis.com/v4/spreadsheets/●{spreadsheetId}●:batchUpdate
Content-Type: application/json

Authorization Code Request URL
https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force
Access Token Request URL
https://accounts.google.com/o/oauth2/token
Scope
https://www.googleapis.com/auth/spreadsheets
Consumer Key
※ 取得すること
Consumer Secret
※ 取得すること

<通信許可の様子>

▼生成されるべき RequestJson のサンプル
Requestsオブジェクトの中に、AppendCellsRequestオブジェクトを埋める。
※ 列データ(RowData オブジェクト)を繰り返し作ることになる。
{"requests": [{"appendCells": {"sheetId": 0,"rows": [
{"values": [
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "2000-01-01"}},
    {"userEnteredValue": {"stringValue": "売掛金"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "対象外"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"numberValue": 111}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "売上高"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "課税売上 8%"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"numberValue": 111}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "たいとる"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": ""}},
],},
{"values": [
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "2000-01-01"}},
    {"userEnteredValue": {"stringValue": "売掛金"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "対象外"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"numberValue": 111}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "売上高"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "課税売上 8%"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"numberValue": 111}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": "たいとる"}},
    {"userEnteredValue": {"stringValue": ""}},
    {"userEnteredValue": {"stringValue": ""}},
],}
],"fields": "*",},}],}

▼スクリプト工程『TSV to RequestJson』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving ==
var myTsv = data.get("6") + "";  
var sheetGid = data.get("9") + "";  


//// == 演算 / Calculating ==
var myJson = '{"requests": [{"appendCells": {"sheetId": ' 
             + sheetGid
             + ',"rows": [';

var rowsArray = myTsv.split("\n");  // 改行毎に分割し string[] 配列に格納
for (var i=0; i < rowsArray.length; i++){
  myJson += '{"values": [';
  myJson += '{"userEnteredValue": {"stringValue": ""}},';  // 1列目(A列)に空行を入れる

  var cellsArray = rowsArray[i].split("\t");  // Tab毎に分割し string[] 配列に格納
  for (var j=0; j < cellsArray.length; j++){
    if( j == 5 || j == 11 ){      // 7列目(G列)と13列目(M列)は数値列
      myJson += '{"userEnteredValue": {"numberValue": '
             + cellsArray[j]
             + '}},';
    }else{
      myJson += '{"userEnteredValue": {"stringValue": "'
             + cellsArray[j]
             + '"}},';
    }
  }
  myJson += '],},';
}
myJson += '],"fields": "*",},}],}';


//// == ワークフローデータへの代入 / Updating ==
retVal.put("10", myJson );

<データ項目一覧画面>


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

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿