自動同期して取得した取引に各種のタグを自動で付与しようという挑戦の続きです。
前回の記事はこちら。
前回は、条件で指定した更新対象のfreee取引の絞り込みまでを紹介しました。
再掲:PUT(更新)は危険な処理であることを心得る
こちらは前回も触れましたが、APIリクエストのPUT(更新)の処理はもともとあったデータを変更してしまうため、操作を誤ったりスクリプトにバグがあると大きな問題となりますので、慎重に取り組む必要があります。
当記事で紹介しているスクリプトやライブラリを利用して何か不具合があった場合も一切の責任を負いかねますので、予めご承知おきください。
更新前の取引をバックアップしておこう
ということで、更新の処理をしたい時には、万が一の事態に備えて更新前の取引データをバックアップするプロセスを組み込んでいます。今回も更新対象の取引を事前にバックアップする処理を実装しましょう。
前回の記事の完成形に今回の記事の機能を追加したスクリプトの全体像はこちら
function renewBaseDeals02() {
/* GAS x freeeAPIライブラリの操作オブジェクトを取得する */
const accessToken = getService().getAccessToken(); // アクセストークンを取得
const company_id = Number(ScriptProperties.getProperty('COMPANY_ID')); // 事業所IDはプロパティストアに格納
const deals_freeeAPI = freeeAPI.deals(accessToken, company_id); // freeeAPIライブラリのdeals操作オブジェクトを作成
/* 前月初日からの取引に絞り込んで取得する */
const today = new Date(); // 今日のDateオブジェクト
const beginLastMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1); // 前月初日のDateオブジェクト
const start_issue_date = Utilities.formatDate(beginLastMonth, 'JST', 'yyyy-MM-dd'); // yyyy-MM-ddの文字列に変換
deals_freeeAPI.queries.start_issue_date = start_issue_date; // APIリクエストのパラメータの発生日に前月初日を代入
const allDeals = deals_freeeAPI.getAllDeals(); // 条件に合致する取引オブジェクトを全て取得する
/* 決済口座:BASE(ECサイト)・取引先:未選択 に該当するオブジェクトを抽出する */
const trgWalletableId = freeeAPI.walletables(accessToken, company_id).getIdByName('BASE(ECサイト)'); // 口座名から口座IDを取得
const trgDeals = allDeals.filter(deal => deal.partner_id === null && Array.isArray(deal.payments) && deal.payments.some(payment => payment.from_walletable_id === trgWalletableId));
/* 更新対象IDの取引をバックアップの上で更新 */
const timeStamp = Utilities.formatDate(new Date(), 'JST', 'yyyyMMddhhmmss'); // バックアップ用のファイルの名前に使用するタイムスタンプ
const fileName = `${company_id}_deals_${timeStamp}.txt`; // 事業所ID_操作エンドポイント_タイムスタンプ.txtのフォーマットでバックアップを保存
const folderId = ScriptProperties.getProperty('ID_BACKUP_FOLDER'); // バックアップファイルを保存するグーグルドライブのフォルダIDを指定
DriveApp.getFolderById(folderId).createFile(fileName, JSON.stringify(trgDeals));
}
バックアップファイルの名前を決める
まずバックアップファイル名ですが…
- 事業所ID
- 操作エンドポイント
- タイムスタンプ
の組み合わせとして、万一リストア(バックアップから戻す)処理をする時のためにもどのタイミングのデータなのかわかるようにします。
const timeStamp = Utilities.formatDate(new Date(), 'JST', 'yyyyMMddhhmmss');
const fileName = `${company_id}_deals_${timeStamp}.txt`;
事業所ID_deals_yyyyMMddhhmmss.txt という形式ですね。
保存先フォルダを指定する
またバックアップファイルの保存先のフォルダの指定のためにフォルダIDが必要ですが、このフォルダIDはプロパティストアに格納しています。
もちろん直接IDを指定してもOKです。
const folderId = Properties.getScriptProperty('ID_BACKUP_FOLDER');
JSON文字列からテキストファイルを作成して保存する
Google Apps Script(以下GAS)でのGoogle ドライブの操作は、DriveAppクラスを使用しますgetFolderById(id)メソッドでFolderオブジェクトを取得し、さらにcreateFile(name, content)メソッドでテキストファイルを作成します。
createFile()メソッドは、引数をいくつかのパターンで指定することができて、いろいろな方法でドライブ内にファイルを作成することができます。
DriveApp.getFolderById(folderId).createFile(fileName, JSON.stringify(trgDeals));
ここでポイントなのが、引数contentになぜJSON.stringify(trgDeals)としているかですが、createFile(name, content)メソッドは、「現在のフォルダーに、与えられたname(名前)とcontetn(内容)でテキストファイルを作成します。内容が50MBを超える場合は例外が発生します。」というメソッドです。なので引数に文字列を渡してあげる必要があります。
定数trgDealsは、JSONオブジェクト形式の取引オブジェクトが格納された配列です。これをJSON文字列にしてテキストファイルに保存できるようにJSON.stringify()メソッドを使用しています。
このあたりは難しいかもですね。GASやJavaScriptの組み込みオブジェクトに関してはあまり深堀りしてはご紹介しないので、このあたりをちゃんと理解されたい方はノンプロ研でぜひGAS講座等を受講してみてください。
ともかくもこれで更新前の取引のバックアップファイルが作成できました。
シリーズ目次
- GAS x freeeAPIライブラリのトリセツ「自動同期で取得した取引に自動でタグを付与しよう」その1 – 条件で指定した更新対象のfreee取引のみ取得する
- GAS x freeeAPIライブラリのトリセツ「自動同期で取得した取引に自動でタグを付与しよう」その2 – 更新前に取引データをバックアップしよう
- GAS x freeeAPIライブラリのトリセツ「自動同期で取得した取引に自動でタグを付与しよう」その3 – 取引を加工してPUT(更新)しよう
Amazon欲しい物リスト公開しています。
開発者のモチベーションアップのためにAmazon欲しい物リストを公開しております。役に立ったよ!という方の感謝の気持ちで何かいただけるのであれば嬉しいです笑