LoginSignup
5
2

More than 5 years have passed since last update.

TeamSpirit勤怠入力自動化bookmarklet

Posted at

概要

TeamSpiritの勤怠入力自動化bookmarklet作ったら労務に怒られました。

よって私はもう使いませんが、使えそうな人はどうぞご自由に。

出勤退勤時間は変えてね。<dialog>要素で最初だけ対話させて設定できるようにしようとか考えてたよ。

特徴

  • 出勤日のみ入力
    • .day_time0で実現
  • 入力済の欄は上書きしない

コードについて

  • 入力決定ボタンの'click'イベント内でXHRが飛ぶため非同期に
  • 次のモーダルを開くのが早いとエラーで止まる
  • timerで入力フォームのモーダルが消えたかを定期ポーリング
    • 妥協案。他に検討した案を下記に残す

Event追加で検知

  • 'click'イベントの非同期処理後に何かイベントが発火していたら、addEventListenerで連続的に処理できそう
  • monitorEvents(document)で調べたが利用できそうなものはなかった

MutationObserver

const observer = new MutationObserver((mutations) => {
  mutations.forEach(console.log);
});

observer.observe(document.body, {
  attributes: true,
  childList: true,
  subtree: true,
  attributeOldValue: true
});

debug後はリロードか監視中止を忘れずに

observer.disconnect();

DOMの要素削除に限ればdocument.body.addEventListner('DOMNodeRemoved', cb)でもdebugできそう

  • モーダルが閉じた後の特徴的なDOMの変更があれば検知時に次の処理に移行すれば良い
  • モーダル内の要素(#dlgInpTimeOkなど)の削除を検知でできると思ったがうまくいかなかった

XHRのレスポンスをHook

  • 試してないけど筋は良さそう
    • document.body.addEventListner('loadend', cb)とか?

中身

https://gist.github.com/darai0512/925591b7d7bac378fbad497d1ae5ed68 にbookmarklet形式とか置いてます

(() => {
  const targets = document.querySelectorAll('td.dval.vst.day_time0');
  const len = targets.length;
  if (len === 0) return;
  let i = 0;
  const id = setInterval(() => {
    if (document.querySelector('#dlgInpTimeOk') !== null) return;
    targets[i++].click();
    const st = document.querySelector('#startTime');
    if (st.value === '') st.value = '12:00';
    const en = document.querySelector('#endTime');
    if (en.value === '') en.value = '20:00';
    document.querySelector('#dlgInpTimeOk').click();
    if (i === len) clearInterval(id);
  }, 1000);
})()
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2