// ==UserScript== // @name 腾讯文档 - 快递工具合集 // @namespace http://tampermonkey.net/ // @version 3.0 // @description 功能1:CSV单号匹配G列 | 功能2:杂乱文本智能解析+多物品分行填充 // @author Codex // @match https://docs.qq.com/sheet/* // @icon https://docs.qq.com/favicon.ico // @grant GM_addStyle // @grant GM_notification // @license MIT // ==/UserScript== (function(){"use strict"; function sleep(ms){return new Promise(function(r){setTimeout(r,ms)})} function L(el,text,cls){var d=document.createElement("div");d.textContent=text;if(cls)d.className=cls;el.appendChild(d);el.scrollTop=el.scrollHeight} async function writeCell(cell,value){ var lb=document.querySelector(".bar-label"),ed=document.querySelector("#alloy-simple-text-editor"); if(!lb||!ed)return false; lb.focus();lb.value=cell;lb.dispatchEvent(new Event("input",{bubbles:true})); ["keydown","keypress","keyup"].forEach(function(t){lb.dispatchEvent(new KeyboardEvent(t,{key:"Enter",keyCode:13,which:13,code:"Enter",bubbles:true}))}); lb.dispatchEvent(new Event("change",{bubbles:true})); await sleep(200); ed.focus();ed.textContent="";document.execCommand("selectAll",false);document.execCommand("delete",false); await sleep(30); ed.textContent=String(value||"");ed.dispatchEvent(new Event("input",{bubbles:true})); ed.dispatchEvent(new Event("change",{bubbles:true})); await sleep(50);ed.blur();await sleep(100);return true } async function fillRows(rows,sr,cols){var ok=0,fail=0;for(var i=0;i=0&&ti>=0){for(var i=1;i=0;i--){if(isName(bp[i].trim())){r.name=bp[i].trim();break}}} // 地址 var pRe=/^(?:北京|天津|上海|重庆|河北|山西|辽宁|吉林|黑龙江|江苏|浙江|安徽|福建|江西|山东|河南|湖北|湖南|广东|海南|四川|贵州|云南|陕西|甘肃|青海|台湾|内蒙古|广西|西藏|宁夏|新疆)/; if(r.name){var ni=-1;for(var i=0;i=0){r.address=(r.address||"")+segs.slice(0,ni).join("");segs=segs.slice(ni+1)}} if(!r.address){var aS=[],oS=[];for(var i=0;i=0){var lf=r.address.substring(ai).trim();r.address=r.address.substring(0,ai).trim();var ips=splItems(lf);for(var ip=0;ip=1){var ss=splItems(segs[i]);for(var j=0;j1?[""]:[]);r._qty=mq;return r; function filterUnique(a){var seen={};return a.filter(function(x){if(seen[x])return false;seen[x]=true;return true})} } function parseMultipleOrders(text,startLine){ if(startLine>1){var _ls=text.split("\n");text=_ls.slice(startLine-1).join("\n")} // 先尝试全文当一个订单 var _single=parseOrder(text); if(_single&&_single.name&&_single.phone){ var _si=_single.items.length?_single.items:[""];var _sr=[]; for(var _j=0;_j<_si.length;_j++){for(var _k=0;_k<_single._qty;_k++){_sr.push({name:_single.name,phone:_single.phone,landline:_single.landline,address:_single.address,item:_si[_j]})}} return{rows:_sr,errors:[]} } // 按空白行分割 var blocks=text.split(/\n\s*\n/).map(function(b){return b.trim()}).filter(Boolean); var allRows=[],errs=[]; for(var i=0;i"+t,"ok");fill++}else{L(log,"第"+r+"行写入失败","err");fail++} await sleep(30) } L(log,"\n完成:填充"+fill+"行,跳过"+skip+"行,失败"+fail+"行");btn.textContent="完成";btn.disabled=false; GM_notification({text:"单号匹配完成:"+fill+"行",timeout:3000}) }) } function buildParse(ov){ var t=ov.querySelector("#tab-parse"); t.innerHTML='
粘贴杂乱快递文本,逐行解析,多物品拆分行,可选字段填入表格(起始行默认1不从开头跳过)。
'; var ta=t.querySelector("textarea"),pv=t.querySelector("#ppv"),pl=t.querySelector("#ppl"),pb=t.querySelector("#ppb"); var curRows=[]; t.querySelector("#ppc").addEventListener("click",function(){ov.remove()}); t.querySelector("#ppp").addEventListener("click",function(){ var text=ta.value.trim();if(!text){alert("请先粘贴文本");return} var sl=parseInt(t.querySelector(".prn").value)||1; var result=parseMultipleOrders(text,1);curRows=result.rows; if(!curRows.length){var _em=result.errors&&result.errors.length?"\n错误: "+result.errors.join("; "):"";alert("解析失败,0行结果"+_em+"\n\n检查:\n1. 文本格式是否正确\n2. 是否有手机号\n(起始行"+sl+"仅控制填入表格位置)");return} pv.style.display="block";var h='
'; for(var i=0;i"} h+="
姓名手机固话地址物品
"+r.name+""+r.phone+""+(r.landline||"")+""+r.address+""+r.item+"
";pv.innerHTML=h; pl.style.display="block";pl.innerHTML="";L(pl,"共"+curRows.length+"行数据");L(pl,"共"+result.errors.length+"个错误");if(result.errors.length)result.errors.forEach(function(e){L(pl,"!"+e,"err")}); pb.style.display="flex" }); t.querySelector("#ppfill").addEventListener("click",async function(){ if(!curRows.length)return;var sr=parseInt(t.querySelector(".prn").value)||1; if(t.querySelector(".auto-row").checked)sr=await findFirstEmptyRow(sr); var cbs=t.querySelectorAll(".pcb"),cols={};if(cbs[0].checked)cols["A"]="name";if(cbs[1].checked)cols["B"]="phone";if(cbs[2].checked)cols["C"]="landline";if(cbs[3].checked)cols["D"]="address";if(cbs[4].checked)cols["E"]="item"; var btn=t.querySelector("#ppfill");btn.disabled=true;btn.textContent="写入中..."; var r=await fillRows(curRows,sr,cols);btn.textContent="填入表格";btn.disabled=false; L(pl,"成功"+r.ok+"格,失败"+r.fail+"格");GM_notification({text:"已写入"+curRows.length+"行",timeout:3000}) }) } })();