【悲報】マネーフォワードクラウド請求書APIのv3バージョンアップに対応したばかりなのにもうAPIが非推奨になりました…再び直します【GAS】
こんにちは…
今回は最初から悲しいお知らせです。
ついこの前、こちらの記事を書きました↓
苦労して調査した甲斐あって、
こちらの記事は多くの方々にお読みいただいている人気記事となりました。
ところが先日、以下のニュースが発表されました↓
MFクラウド請求書は少し前から、手動で請求書を作成する際のテンプレートを、
旧型式か新形式か選択して作成できるようになっていました。
ところが、それ以降に発表されたv3のAPIで請求書を作成しても、
何故か出力される帳票は旧型式で固定で、選択できませんでした。
「まあ、待ってたらいつか対応されるだろう。」と吞気に考えておりましたが、
先日公式から発表された情報は信じ難いもので…
『v3.1.0で新形式請求書作成用に別でAPI追加しといたよ!
これまでの請求書作成用API(旧型式)はDeprecated(非推奨)になったよ!
旧型式請求書は2023年10月1日から作成できなくなるって前からお知らせしてたけど、
勿論この請求書作成用API(旧型式)も2023年10月1日から使えなくなるからよろしく!(意訳)』
…流石に酷くないですか??
だったらそのAPI後から追加じゃなくて最初から用意しておけよって話ですし、
ただでさえv1・v2廃止までタイトなスケジュールなのに、
折角v3に書き直したプログラム、また書き直しが必要になってしまいました。。。
ということで、今回は前回書き直したプログラムを再度書き直していく記事になります。
これまでの記事『Google Apps Scriptでマネーフォワードクラウドの請求書を毎月自動発行』はこちら↓
今回はv3対応篇の記事のコードを書き換えていくので、未読の方は先にご一読いただければ幸いです!
新形式請求書作成API
今回はv3のAPIの中から使うAPIを変えるだけなので、認証方法は前回の記事から変更ありません。
また、API自体も旧型式と新形式でリクエスト方法は同一で、
レスポンスもちょっと項目が増えただけで殆ど同じです。
// 請求書作成(引数で取引先の部門を指定)
function createNewInvoice_(department) {
// 請求書IDを返却
return JSON.parse(UrlFetchApp.fetch('https://invoice.moneyforward.com/api/v3/invoice_template_billings', {
method: 'POST',
contentType: 'application/json',
headers: {
accept: 'application/json',
Authorization: 'Bearer ' + getService_().getAccessToken()
},
payload: JSON.stringify({
department_id: department,
billing_date: Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd'),
due_date: Utilities.formatDate((d => {
d.setMonth(d.getMonth() + 1);
d.setDate(0);
return d;
})(new Date()), 'JST', 'yyyy-MM-dd')
})
})).id;
}
変更点は、「UrlFetchApp.fetch()」の引数のURLの部分を、
「https://invoice.moneyforward.com/api/v3/billings」から、
「https://invoice.moneyforward.com/api/v3/invoice_template_billings」に変えただけです。
リクエストボディを変える手間はかからなかったのが不幸中の幸いでした。
※書き直しのボリューム自体は大したことなくても再テスト等の手間が…
品目追加API
上記の変更だけで取り急ぎの対応は済みましたが、
実は請求書を作成した後に実行する品目追加APIにも地味に変更がありましたのでご紹介します。
こちらは非推奨になったのではなく、既存のAPIのアップデート(機能追加)です。
MFクラウド請求書の新形式請求書作成画面をよく見てみると、明細入力欄に、
「納品日」と「納品書番号」という項目が新たに追加されており、
新形式請求書にも出力されるようになっています。
これらは作成した請求書1つずつに対して非表示設定を行わないと、
残念ながら現時点では一括非表示設定はできないようで(今後開発予定とのこと)、
APIでも非表示にすることはできません。
しかし、納品日と納品書番号を用意できるのであれば、
品目追加APIでこれらを設定することができるようになりました。
// 請求書への品目追加(引数で請求書IDと品目を指定)
function attachItems_(billing, items) {
// 品目は複数指定できるよう配列にしてループ
items.forEach(item => {
UrlFetchApp.fetch(`https://invoice.moneyforward.com/api/v3/billings/${billing}/items`, {
method: 'POST',
contentType: 'application/json',
headers: {
accept: 'application/json',
Authorization: 'Bearer ' + getService_().getAccessToken()
},
payload: JSON.stringify({
item_id: item,
delivery_number: '202304-001',
delivery_date: Utilities.formatDate(new Date(2023, 4, 0), 'JST', 'yyyy-MM-dd')
})
});
});
}
新たに「delivery_number(納品書番号)」と「delivery_date(納品日)」を、
リクエストボディに追加しました。
上記の例では仮の値を入れているので、毎月自動発行できるようにするには、
ここの値を自動で用意できるようにしておきたいですね。
※納品日はともかく納品書番号は結構悩むことになりそう…
【追記】
v3.2.1から、新形式請求書作成APIで直接品目追加ができるようになりました。
リクエストボディに配列itemsを追加し、配列内のオブジェクトに「item_id」を設定してください。
「delivery_number」及び「delivery_date」も品目追加API同様に設定可能です。
詳細はこちらをご覧ください。
// 請求書作成(引数で取引先の部門と品目を指定)
function createNewInvoice_(department, items) {
UrlFetchApp.fetch('https://invoice.moneyforward.com/api/v3/invoice_template_billings', {
method: 'POST',
contentType: 'application/json',
headers: {
accept: 'application/json',
Authorization: 'Bearer ' + getService_().getAccessToken()
},
payload: JSON.stringify({
department_id: department,
billing_date: Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd'),
due_date: Utilities.formatDate((d => {
d.setMonth(d.getMonth() + 1);
d.setDate(0);
return d;
})(new Date()), 'JST', 'yyyy-MM-dd'),
items: items.map(item => ({
item_id: item,
delivery_number: '202304-001',
delivery_date: Utilities.formatDate(new Date(2023, 4, 0), 'JST', 'yyyy-MM-dd')
})
})
});
}
終わりに
最後までお読みいただきありがとうございました!
最近マネーフォワードクラウドに関して文句ばかり言っていますが、
これまで電子帳簿保存法対応や電子契約等、コスト以上に助けられてきた部分が沢山ありました。
マネーフォワードクラウドは本当に素晴らしいシステムだと思っているからこそ、
我々としてもマネーフォワードクラウドのAPIを活用したシステムを、
今後より多く作っていきたいと思っております。
だからこそ、今後はもっとAPI利用者に優しい運用になっていくことを願うばかりです。