手作業でぽちぽちするのが辛かったので作った
- https://moneyforward.com/cf を開く
- ブラウザのDevTools を開いてScript を実行
- searchText は「内容」でヒットさせたい文字列
- large_category_id, middle_category_id は、 Networkタブを開いて、1回分類設定したときに飛ぶリクエストを見て設定する
手作業でぽちぽちするのが辛かったので作った
| { | |
| // 一括設定したい作品名 | |
| const searchText = '作品名' | |
| // 趣味・娯楽、本に設定する例 | |
| const large_category_id = 13 | |
| const middle_category_id = 52 | |
| const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) | |
| const csrfToken = document | |
| .querySelector('[name="csrf-token"]') | |
| .getAttribute('content') | |
| const callApi = (id) => async () => { | |
| await sleep(2000) | |
| console.log(`${id} update`) | |
| await fetch('https://moneyforward.com/cf/update', { | |
| headers: { | |
| accept: 'text/javascript', | |
| 'accept-language': 'ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7', | |
| 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', | |
| 'x-csrf-token': csrfToken, | |
| 'x-requested-with': 'XMLHttpRequest', | |
| }, | |
| body: `user_asset_act%5Bid%5D=${id}&user_asset_act%5Blarge_category_id%5D=${large_category_id}&user_asset_act%5Bmiddle_category_id%5D=${middle_category_id}&user_asset_act%5Btable_name%5D=user_asset_act&user_asset_act%5Bis_income%5D=0`, | |
| method: 'PUT', | |
| mode: 'cors', | |
| credentials: 'include', | |
| }) | |
| } | |
| const ids = $$('td.content') | |
| .filter((elm) => elm.innerText.includes(searchText)) | |
| .map((elm) => elm.parentNode) | |
| .filter((elm) => elm.querySelector('td.lctg').innerText === '未分類') | |
| .map((elm) => elm.querySelector('[name="user_asset_act[id]"]').value) | |
| const tasks = ids.map((id) => callApi(id)) | |
| tasks | |
| .reduce((promise, task) => promise.then(task), Promise.resolve()) | |
| .then(() => alert('done (リロードすると反映されてるはず)')) | |
| } |