Greasy Fork 支持简体中文。

美团-导出表格

2021/8/25 下午8:16:44

// ==UserScript==
// @name        美团-导出表格
// @namespace   Violentmonkey Scripts
// @match       https://km.sankuai.com/page/*
// @grant       none
// @version     2.0
// @author      -
// @description 2021/8/25 下午8:16:44
// @require https://cdn.bootcdn.net/ajax/libs/exceljs/4.2.1/exceljs.min.js
// ==/UserScript==


(function () {
  'use strict';
  let exportBtn = null;
  const createUserList = ['杨佳丽', '庞布斯', 'pangbusi', 'yangjiali03'];
  let timerStart = +new Date();
  let reqId = null;
  // Your code here...
  function init() {
    if (+new Date() > timerStart + 5000) {
      cancelAnimationFrame(reqId)
    } else {
      try {
        let createUser = document.getElementsByClassName('ct-user-name')[0].innerText;
        if (createUserList.includes(createUser)) {
          exportBtn = document.createElement("button");
          exportBtn.innerText = "导出"
          exportBtn.style.width = "180px";
          exportBtn.style.height = "80px";
          exportBtn.style.align = "center";
          exportBtn.style.background = "#6496c8";
          exportBtn.style.border = "none";//52
          exportBtn.style.borderRadius = "10px"
          exportBtn.style.color = "#fff";
          exportBtn.style.position = "absolute"
          exportBtn.style.left = "1000px"
          exportBtn.style.top = "100px"
          exportBtn.id = "but"
          document.querySelector('body').appendChild(exportBtn)
        }
        cancelAnimationFrame(reqId)
      } catch(e) {
        reqId = requestAnimationFrame(init)
      }
    }
  }

  function exportExcel(retData) {
    const workbook = new ExcelJS.Workbook();
    // 在加载时强制工作簿计算属性
    workbook.calcProperties.fullCalcOnLoad = true;

    // 创建一个具有属性的可写的新工作表
    const worksheet = workbook.addWorksheet('sheet', { properties: { outlineLevelCol: 1 } });
    // 使工作表可见
    worksheet.state = 'visible';
    // 之后调整属性(工作表读写器不支持该操作)
    worksheet.properties.outlineLevelCol = 2;
    worksheet.properties.defaultRowHeight = 15;

    // 添加列标题并定义列键和宽度
    // 注意:这些列结构仅是构建工作簿的方便之处,除了列宽之外,它们不会完全保留。
    worksheet.columns = [
      { header: '姓名', key: 'name', width: 20 },
      { header: '出勤天数系数(标准值:5天)', key: 'attend', width: 40 },
      { header: '5', key: 'coefficient_1', width: 10, outlineLevel: 1 },
      { header: '一面数1(来自业务侧和Recruiter侧简历的安排一面数)', key: 'interview_1', width: 60 },
      { header: '50', key: 'coefficient_2', width: 10 },
      { header: '有效简历数(自主Sourcing简历评审通过数量)', key: 'valid_resume', width: 60 },
      { header: '50', key: 'coefficient_3', width: 10 },
      { header: '一面数2(自主Sourcing简历的安排一面数)', key: 'interview_2', width: 60 },
      { header: '25', key: 'coefficient_4', width: 10 },
      { header: '面试通过数(自主Sourcing简历通过数量)', key: 'count_pass', width: 60 },
      { header: '1', key: 'coefficient_5', width: 10 },
      { header: '总计完成度', key: 'total_completion', width: 20 },
      { header: '', key: 'pass_interviewer', width: 50 },
    ];

    retData.forEach((item) => {
      worksheet.addRow(item);
    })
    // 设置每一列样式 居中
    const row = worksheet.getRow(1);
    row.eachCell((cell, rowNumber) => {
      worksheet.getColumn(rowNumber).alignment = {
        vertical: "middle",
        horizontal: "center",
      };
    });

    workbook.xlsx.writeBuffer().then((buffer) => {
      writeFile('数据.xlsx', buffer);
    });

    // 将二进制转为Excel并下载
    const writeFile = (fileName, content) => {
      let a = document.createElement("a");
      let blob = new Blob([content], { type: "text/plain" });

      a.download = fileName;
      a.href = URL.createObjectURL(blob);
      a.click();
    };
  }
  function bindExportEvent(exportBtn) {
    exportBtn.onclick = function () {
      // read & deal Data
      const tbs = [...document.getElementsByTagName('table')].slice(1);
      const [data, indicator] = [...tbs]
      const data_trs = [...data.children[2].children].slice(1);
      // 第二张表,未用到
      // const indicator_trs = [...data.children[2].children].slice(1);


      let retData = []
      const originData = []
      data_trs.forEach(item => {
        let temp_Arr = []
        item.children.forEach(value => {
          temp_Arr.push(value.innerText)
        })
        originData.push(temp_Arr)
        // let formula = temp_Arr[3] / temp_Arr[4] * 0.4 + temp_Arr[5] / temp_Arr[6] * 0.1 + temp_Arr[7] / temp_Arr[8] * 0.4 + Number(temp_Arr[9]) !== 0 ? Number(temp_Arr[9]) * 0.1 : 0
      })

      originData.forEach(item => {
        let ret = []
        ret[0] = item[0]
        ret[1] = item[1]
        ret[2] = item[1] / 5
        ret[3] = item[2]
        ret[4] = 50 * item[1] / 5
        ret[5] = item[3]
        ret[6] = 50 * item[1] / 5
        ret[7] = item[4]
        ret[8] = 25 * item[1] / 5
        ret[9] = item[5] !== "" ? item[5].split('(')[0] : ""
        ret[10] = 1
        ret[11] = (item[2] / ret[4] * 0.4) + (item[3] / ret[6] * 0.1) + (item[4] / ret[8] * 0.4) + (item[5] !== "" ? Number(ret[9]) / ret[2]  * 0.1 : 0)
        console.log(ret, item, 123);
        ret[11] = (ret[11] * 100).toFixed(0)
        ret[12] = item[5] !== "" ? item[5].slice(1) : ""
        retData.push(ret)
      })

      retData = retData.sort((a, b) => parseFloat(b[11] - parseFloat(a[11])))
      retData.forEach(item => {
        item[11] += "%"
      })
    }
  }
  

  // 主流程
  init()
  if (exportBtn) {
    bindExportEvent(exportBtn) 
  }

})();