trello Card to Excel

trello Card to Excel suppert custom fields

  1. // ==UserScript==
  2. // @name trello Card to Excel
  3. // @namespace http://www.hi-j.com/
  4. // @version 0.1.3
  5. // @description trello Card to Excel suppert custom fields
  6. // @author will
  7. // @match http*://*trello.com/b/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. function Map(){
  13. this.container = new Object();
  14. }
  15. Map.prototype.put = function(key, value){
  16. this.container[key] = value;
  17. };
  18. Map.prototype.get = function(key){
  19. return this.container[key];
  20. };
  21. var tableToExcel = (function() {
  22. var uri = 'data:application/vnd.ms-excel;base64,',
  23. template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table style="font-size:15px;" border="1">{table}</table></body></html>',
  24. base64 = function(s) {
  25. return window.btoa(unescape(encodeURIComponent(s)));
  26. },
  27. format = function(s, c) {
  28. return s.replace(/{(\w+)}/g,
  29. function(m, p) {
  30. return c[p];
  31. });
  32. };
  33. return function(table, name) {
  34. if (!table.nodeType) table = document.getElementById(table);
  35. var ctx = {
  36. worksheet: name || 'Worksheet',
  37. table: table.innerHTML
  38. };
  39. window.location.href = uri + base64(format(template, ctx));
  40. };
  41. })();
  42. var getPluginDataById = function(pluginData){
  43. var obj = null;
  44. if(pluginData.length > 0){
  45. //onsole.log(pluginData.length);
  46. $.each(pluginData,function(){
  47. if(this.idPlugin == '56d5e249a98895a9797bebb9'){ //判断是自定义字段的插件ID
  48. //onsole.log(this.value);
  49. eval('obj = '+this.value+';');
  50. return obj;
  51. }
  52. });
  53. }
  54. return obj;
  55. };
  56. var getPluginFields = function(data){
  57. var pluginFields = new Array();
  58. var tmp = getPluginDataById(data.pluginData);
  59. if(tmp){
  60. var fields = tmp.fields;
  61. $.each(fields,function(){
  62. pluginFields.push(this);
  63. });
  64. }
  65. return pluginFields;
  66. };
  67. // 获取{id,value} id == key , return value;
  68. var getPlauginVal = function(data,key){
  69. var ret = null;
  70. $.each(data,function(){
  71. if(this.id == key){
  72. ret = this.value;
  73. return ret;
  74. }
  75. });
  76. return ret;
  77. };
  78. var getListMap = function(data){
  79. var map = new Map();
  80. $.each(data.lists,function(){
  81. map.put(this.id,this.name);
  82. //onsole.log(this.id+":"+this.name);
  83. });
  84. return map;
  85. };
  86. var getMembersMap = function(data){
  87. var map = new Map();
  88. $.each(data.members,function(){
  89. map.put(this.id,this);
  90. });
  91. return map;
  92. };
  93. var init = function(){
  94. var test = $('<a class="board-header-btn board-header-btn-org-name board-header-btn-without-icon"><span class="board-header-btn-text" id="tableToExcel">导出Excel</span></a>');
  95. test.click(function(){
  96. $.getJSON(window.location.href+".json", function(data) {
  97. var members = getMembersMap(data);
  98. var pluginFields = getPluginFields(data);
  99. var table = document.createElement("table");
  100. // 标题开始
  101. tr = document.createElement("tr"); //tr start
  102. var tds = ['标题','状态','标签','成员','过期'];
  103. $.each(pluginFields,function(){
  104. tds.push(this.n);
  105. });
  106. $.each(tds,function(){
  107. td = document.createElement("td");
  108. td.style.backgroundColor = "red";
  109. td.innerHTML = this;
  110. tr.append(td);
  111. });
  112. table.append(tr); // tr end
  113. // 内容开始
  114. var listMap = getListMap(data);
  115. var tr,td,pluginData;
  116. $.each(data.cards,function(){
  117. if(this.name.indexOf('#') == -1){
  118. tr = document.createElement("tr"); // tr start
  119. // 标题
  120. td = document.createElement("td");
  121. td.innerHTML = this.name;
  122. tr.append(td);
  123. // 状态
  124. td = document.createElement("td");
  125. td.innerHTML = listMap.get(this.idList);
  126. tr.append(td);
  127. // 标签
  128. td = document.createElement("td");
  129. var str = "";
  130. if(this.labels.length > 0){
  131. $.each(this.labels,function(){
  132. str += this.name+",";
  133. });
  134. if(str.length > 0){
  135. str = str.substring(0,str.length-1);
  136. }
  137. }
  138. td.innerHTML = str;
  139. tr.append(td);
  140. // 成员
  141. td = document.createElement("td");
  142. str = "";
  143. if(this.idMembers.length > 0){
  144. $.each(this.idMembers,function(){
  145. str += members.get(this).fullName+",";
  146. });
  147. if(str.length > 0){
  148. str = str.substring(0,str.length-1);
  149. }
  150. }
  151. td.innerHTML = str;
  152. tr.append(td);
  153. // 过期
  154. td = document.createElement("td");
  155. td.innerHTML = this.due;
  156. tr.append(td);
  157. // 插件
  158. if(this.pluginData.length > 0){ // 判断没有插件的
  159. var pluginData = getPluginDataById(this.pluginData).fields;
  160. $.each(pluginFields,function(){
  161. td = document.createElement("td");
  162. if(this.t == '0'){
  163. td.innerHTML = pluginData[this.id] || '';
  164. }else if(this.t == '4'){
  165. td.innerHTML = getPlauginVal(this.o,pluginData[this.id]) || '';
  166. }else if(this.t == '3'){
  167. td.innerHTML = pluginData[this.id] || '';
  168. }else{
  169. console.log(this.t +"--"+ pluginData[this.id]);
  170. // todo
  171. }
  172. tr.append(td);
  173. });
  174. }
  175. table.append(tr); // tr end
  176. }
  177. });
  178. //onsole.log(table.innerHTML);
  179. tableToExcel(table);
  180. });
  181. });
  182. $('div.board-header').append(test);
  183. };
  184. setInterval(function(){
  185. if(!$('#tableToExcel').html()){
  186. init();
  187. }
  188. },1000);
  189. })();