diff --git a/src/controllers/handler.js b/src/controllers/handler.js
index 6d225ab4b..5c1e73a6a 100644
--- a/src/controllers/handler.js
+++ b/src/controllers/handler.js
@@ -76,8 +76,6 @@ export default function luckysheetHandler() {
     if(isMobile){
         mobileinit();
     }
-    
-
     if (!Date.now)
     Date.now = function() { return new Date().getTime(); };
     //requestAnimationFrame method
@@ -3267,7 +3265,6 @@ export default function luckysheetHandler() {
     });
     //表格mouseup
     $(document).on("mouseup.luckysheetEvent",function (event) {
-
         if(luckysheetConfigsetting  && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.sheetMouseup){
             let mouse = mouseposition(event.pageX, event.pageY);
             let x = mouse[0] + $("#luckysheet-cell-main").scrollLeft();
@@ -3665,14 +3662,14 @@ export default function luckysheetHandler() {
 
             jfrefreshgrid_rhcw(Store.flowdata.length, null);
         }
-
+        
         //改变列宽
         if (Store.luckysheet_cols_change_size) {
             Store.luckysheet_cols_change_size = false;
             $("#luckysheet-change-size-line").hide();
             $("#luckysheet-cols-change-size").css("opacity", 0);
             $("#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas").css("cursor", "default");
-
+            
             let mouse = mouseposition(event.pageX, event.pageY);
             let scrollLeft = $("#luckysheet-cols-h-c").scrollLeft();
             let x = mouse[0] + scrollLeft;
@@ -3685,9 +3682,9 @@ export default function luckysheetHandler() {
                 col = col_location[1],
                 col_pre = col_location[0],
                 col_index = col_location[2];
-
             let size = (x + 3) - Store.luckysheet_cols_change_size_start[0];
 
+            
             let firstcolumnlen = Store.defaultcollen;
             if (Store.config["columnlen"] != null && Store.config["columnlen"][Store.luckysheet_cols_change_size_start[1]] != null) {
                 firstcolumnlen = Store.config["columnlen"][Store.luckysheet_cols_change_size_start[1]];
diff --git a/src/controllers/select.js b/src/controllers/select.js
index 7c99837d4..4cff768ef 100644
--- a/src/controllers/select.js
+++ b/src/controllers/select.js
@@ -7,65 +7,64 @@ import dataVerificationCtrl from './dataVerificationCtrl';
 import { getSheetIndex, getRangetxt } from '../methods/get';
 import Store from '../store';
 import locale from '../locale/locale';
-import method from '../global/method';
 
 //公式函数 选区实体框
 function seletedHighlistByindex(id, r1, r2, c1, c2) {
-    let row = Store.visibledatarow[r2], 
+    let row = Store.visibledatarow[r2],
         row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
-    let col = Store.visibledatacolumn[c2], 
+    let col = Store.visibledatacolumn[c2],
         col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];
 
-    $('#' + id).css({ 
-        "left": col_pre, 
-        "width": col - col_pre - 1, 
-        "top": row_pre, 
-        "height": row - row_pre - 1 
+    $('#' + id).css({
+        "left": col_pre,
+        "width": col - col_pre - 1,
+        "top": row_pre,
+        "height": row - row_pre - 1
     });
 }
 
 //Set selection highlight
-function selectHightlightShow(isRestore=false) {
+function selectHightlightShow(isRestore = false) {
     $("#luckysheet-cell-selected-boxs").show();
     $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").siblings(".luckysheet-cell-selected").remove();
 
-    if(Store.luckysheet_select_save.length > 0){
-        for(let i = 0; i < Store.luckysheet_select_save.length; i++){
-            let r1 = Store.luckysheet_select_save[i].row[0], 
-                r2 = Store.luckysheet_select_save[i].row[1]; 
-            let c1 = Store.luckysheet_select_save[i].column[0], 
+    if (Store.luckysheet_select_save.length > 0) {
+        for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
+            let r1 = Store.luckysheet_select_save[i].row[0],
+                r2 = Store.luckysheet_select_save[i].row[1];
+            let c1 = Store.luckysheet_select_save[i].column[0],
                 c2 = Store.luckysheet_select_save[i].column[1];
-            
+
             let rf, cf;
-            if(Store.luckysheet_select_save[i].row_focus == null){
+            if (Store.luckysheet_select_save[i].row_focus == null) {
                 rf = r1;
             }
-            else{
-                rf = Store.luckysheet_select_save[i].row_focus;    
+            else {
+                rf = Store.luckysheet_select_save[i].row_focus;
             }
 
-            if(Store.luckysheet_select_save[i].column_focus == null){
+            if (Store.luckysheet_select_save[i].column_focus == null) {
                 cf = c1;
             }
-            else{
+            else {
                 cf = Store.luckysheet_select_save[i].column_focus;
             }
 
-            let row = Store.visibledatarow[r2], 
+            let row = Store.visibledatarow[r2],
                 row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
-            let col = Store.visibledatacolumn[c2], 
+            let col = Store.visibledatacolumn[c2],
                 col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];
 
-            let row_f = Store.visibledatarow[rf], 
+            let row_f = Store.visibledatarow[rf],
                 row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];
-            let col_f = Store.visibledatacolumn[cf], 
+            let col_f = Store.visibledatacolumn[cf],
                 col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];
 
             let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);
-            if(!!margeset){
+            if (!!margeset) {
                 row_f = margeset.row[1];
                 row_pre_f = margeset.row[0];
-                
+
                 col_f = margeset.column[1];
                 col_pre_f = margeset.column[0];
             }
@@ -86,81 +85,81 @@ function selectHightlightShow(isRestore=false) {
             Store.luckysheet_select_save[i]["top_move"] = row_pre;
             Store.luckysheet_select_save[i]["height_move"] = row - row_pre - 1;
 
-            if(i == 0){
-                if(Store.luckysheet_select_save.length == 1){
-                    if(browser.mobilecheck()){//移动端
-                        $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({ 
-                            "left": Store.luckysheet_select_save[i]["left_move"], 
-                            "width": Store.luckysheet_select_save[i]["width_move"], 
-                            "top": Store.luckysheet_select_save[i]["top_move"], 
-                            "height": Store.luckysheet_select_save[i]["height_move"], 
-                            "display": "block", 
-                            "border": "1px solid #0188fb" 
+            if (i == 0) {
+                if (Store.luckysheet_select_save.length == 1) {
+                    if (browser.mobilecheck()) {//移动端
+                        $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({
+                            "left": Store.luckysheet_select_save[i]["left_move"],
+                            "width": Store.luckysheet_select_save[i]["width_move"],
+                            "top": Store.luckysheet_select_save[i]["top_move"],
+                            "height": Store.luckysheet_select_save[i]["height_move"],
+                            "display": "block",
+                            "border": "1px solid #0188fb"
                         })
-                        .find(".luckysheet-cs-draghandle")
-                        .css("display", "block")
-                        .end()
-                        .find(".luckysheet-cs-fillhandle")
-                        .css("display", "none")
-                        .end()
-                        .find(".luckysheet-cs-touchhandle")
-                        .css("display", "block");
+                            .find(".luckysheet-cs-draghandle")
+                            .css("display", "block")
+                            .end()
+                            .find(".luckysheet-cs-fillhandle")
+                            .css("display", "none")
+                            .end()
+                            .find(".luckysheet-cs-touchhandle")
+                            .css("display", "block");
                     }
-                    else{
-                        $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({ 
-                            "left": Store.luckysheet_select_save[i]["left_move"], 
-                            "width": Store.luckysheet_select_save[i]["width_move"], 
-                            "top": Store.luckysheet_select_save[i]["top_move"], 
-                            "height": Store.luckysheet_select_save[i]["height_move"], 
-                            "display": "block", 
-                            "border": "1px solid #0188fb" 
+                    else {
+                        $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({
+                            "left": Store.luckysheet_select_save[i]["left_move"],
+                            "width": Store.luckysheet_select_save[i]["width_move"],
+                            "top": Store.luckysheet_select_save[i]["top_move"],
+                            "height": Store.luckysheet_select_save[i]["height_move"],
+                            "display": "block",
+                            "border": "1px solid #0188fb"
                         })
+                            .find(".luckysheet-cs-draghandle")
+                            .css("display", "block")
+                            .end()
+                            .find(".luckysheet-cs-fillhandle")
+                            .css("display", "block")
+                            .end()
+                            .find(".luckysheet-cs-touchhandle")
+                            .css("display", "none");
+                    }
+                }
+                else {
+                    $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({
+                        "left": Store.luckysheet_select_save[i]["left_move"],
+                        "width": Store.luckysheet_select_save[i]["width_move"],
+                        "top": Store.luckysheet_select_save[i]["top_move"],
+                        "height": Store.luckysheet_select_save[i]["height_move"],
+                        "display": "block",
+                        "border": "1px solid rgba(1, 136, 251, 0.15)"
+                    })
                         .find(".luckysheet-cs-draghandle")
-                        .css("display", "block")
+                        .css("display", "none")
                         .end()
                         .find(".luckysheet-cs-fillhandle")
-                        .css("display", "block")
-                        .end()
-                        .find(".luckysheet-cs-touchhandle")
                         .css("display", "none");
-                    }
-                }
-                else{
-                    $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({ 
-                        "left": Store.luckysheet_select_save[i]["left_move"], 
-                        "width": Store.luckysheet_select_save[i]["width_move"], 
-                        "top": Store.luckysheet_select_save[i]["top_move"], 
-                        "height": Store.luckysheet_select_save[i]["height_move"], 
-                        "display": "block", 
-                        "border": "1px solid rgba(1, 136, 251, 0.15)" 
-                    })
-                    .find(".luckysheet-cs-draghandle")
-                    .css("display", "none")
-                    .end()
-                    .find(".luckysheet-cs-fillhandle")
-                    .css("display", "none");
                 }
             }
-            else{
-                $("#luckysheet-cell-selected-boxs").append('<div class="luckysheet-cell-selected" style="left: '+ Store.luckysheet_select_save[i]["left_move"] +'px; width: '+ Store.luckysheet_select_save[i]["width_move"] +'px; top: '+ Store.luckysheet_select_save[i]["top_move"] +'px; height: '+ Store.luckysheet_select_save[i]["height_move"] +'px; border: 1px solid rgba(1, 136, 251, 0.15); display: block;"></div>');
+            else {
+                $("#luckysheet-cell-selected-boxs").append('<div class="luckysheet-cell-selected" style="left: ' + Store.luckysheet_select_save[i]["left_move"] + 'px; width: ' + Store.luckysheet_select_save[i]["width_move"] + 'px; top: ' + Store.luckysheet_select_save[i]["top_move"] + 'px; height: ' + Store.luckysheet_select_save[i]["height_move"] + 'px; border: 1px solid rgba(1, 136, 251, 0.15); display: block;"></div>');
             }
 
-            if(i == Store.luckysheet_select_save.length - 1){
+            if (i == Store.luckysheet_select_save.length - 1) {
                 //focus 取选区数组最后一个
-                $("#luckysheet-cell-selected-focus").css({ 
-                    "left": Store.luckysheet_select_save[i]["left"], 
-                    "width": Store.luckysheet_select_save[i]["width"], 
-                    "top": Store.luckysheet_select_save[i]["top"], 
-                    "height": Store.luckysheet_select_save[i]["height"], 
-                    "display": "block" 
+                $("#luckysheet-cell-selected-focus").css({
+                    "left": Store.luckysheet_select_save[i]["left"],
+                    "width": Store.luckysheet_select_save[i]["width"],
+                    "top": Store.luckysheet_select_save[i]["top"],
+                    "height": Store.luckysheet_select_save[i]["height"],
+                    "display": "block"
                 });
                 //行列数
                 luckysheet_count_show(
-                    Store.luckysheet_select_save[i]["left_move"], 
-                    Store.luckysheet_select_save[i]["top_move"], 
-                    Store.luckysheet_select_save[i]["width_move"], 
-                    Store.luckysheet_select_save[i]["height_move"], 
-                    [r1, r2], 
+                    Store.luckysheet_select_save[i]["left_move"],
+                    Store.luckysheet_select_save[i]["top_move"],
+                    Store.luckysheet_select_save[i]["width_move"],
+                    Store.luckysheet_select_save[i]["height_move"],
+                    [r1, r2],
                     [c1, c2]
                 );
                 //左上角选择区域框
@@ -171,43 +170,34 @@ function selectHightlightShow(isRestore=false) {
         }
 
         //行列标题栏
-        selectTitlesShow(Store.luckysheet_select_save,isRestore);
+        selectTitlesShow(Store.luckysheet_select_save, isRestore);
 
         //左上角范围显示
         selectHelpboxFill();
-        
+
         //动态数组显示
-        if(Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]){
+        if (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]) {
             dynamicArrayHightShow(Store.luckysheet_select_save[0].row[0], Store.luckysheet_select_save[0].column[0]);
         }
     }
 
     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_select_save = Store.luckysheet_select_save;
-
-    // Hook function, change the range selection box, selectHightlightShow will be triggered multiple times when mousemove is moused, and the historical value is used here to throttle
-    const luckysheet_select_save_previous = JSON.stringify(Store.luckysheet_select_save);
-    
-    if(Store.luckysheet_select_save_previous == null || Store.luckysheet_select_save_previous !== luckysheet_select_save_previous){
-        method.createHookFunction('rangeSelect', Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)], Store.luckysheet_select_save);
-    }
-    
-    Store.luckysheet_select_save_previous = luckysheet_select_save_previous;
 }
 
 //选区标题栏
-function selectTitlesShow(rangeArr,isRestore=false) {
+function selectTitlesShow(rangeArr, isRestore = false) {
     let s = $.extend(true, [], rangeArr);
 
     let rowTitleMap = {}, columnTitleMap = {};
-    for(let i = 0; i < s.length; i++){
+    for (let i = 0; i < s.length; i++) {
         let r1 = s[i]["row"][0], r2 = s[i]["row"][1], c1 = s[i]["column"][0], c2 = s[i]["column"][1];
-        
+
         // if(isRestore){
         //     let margeset = menuButton.mergeborer(Store.flowdata, r1, c1);
         //     if(!!margeset){
         //         r1 = margeset.row[2];
         //         r2 = margeset.row[3];
-                
+
         //         c1 = margeset.column[2];
         //         c2 = margeset.column[3];
         //     }
@@ -222,29 +212,30 @@ function selectTitlesShow(rangeArr,isRestore=false) {
     $("#luckysheet-rows-h-selected").empty();
 
     let rowTitleRange = selectTitlesRange(rowTitleMap);
-    for(let i = 0; i < rowTitleRange.length; i++){
+    for (let i = 0; i < rowTitleRange.length; i++) {
         let r1 = rowTitleRange[i][0], r2 = rowTitleRange[i][rowTitleRange[i].length - 1];
         let row = rowLocationByIndex(r2)[1], row_pre = rowLocationByIndex(r1)[0];
-        
-        $("#luckysheet-rows-h-selected").append('<div class="luckysheet-rows-h-selected" style="top: '+ row_pre +'px; height: '+ (row - row_pre - 1) +'px; display: block; background-color: rgba(76, 76, 76, 0.1);"></div>');
+
+        $("#luckysheet-rows-h-selected").append('<div class="luckysheet-rows-h-selected" style="top: ' + row_pre + 'px; height: ' + (row - row_pre - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);"></div>');
     }
 
     //列标题
     $("#luckysheet-cols-h-selected").empty();
 
     let columnTitleRange = selectTitlesRange(columnTitleMap);
-    for(let j = 0; j < columnTitleRange.length; j++){
+    for (let j = 0; j < columnTitleRange.length; j++) {
         let c1 = columnTitleRange[j][0], c2 = columnTitleRange[j][columnTitleRange[j].length - 1];
         let col = colLocationByIndex(c2)[1], col_pre = colLocationByIndex(c1)[0];
-        
-        $("#luckysheet-cols-h-selected").append('<div class="luckysheet-cols-h-selected" style="left: '+ col_pre +'px; width: '+ (col - col_pre - 1) +'px; display: block; background-color: rgba(76, 76, 76, 0.1);"></div>');
+
+        $("#luckysheet-cols-h-selected").append('<div class="luckysheet-cols-h-selected" style="left: ' + col_pre + 'px; width: ' + (col - col_pre - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);"></div>');
+
     }
 }
 function selectTitlesMap(rangeMap, range1, range2) {
     let map = $.extend(true, {}, rangeMap);
-    
-    for(let i = range1; i <= range2; i++){
-        if(i in map){
+
+    for (let i = range1; i <= range2; i++) {
+        if (i in map) {
             continue;
         }
 
@@ -255,51 +246,51 @@ function selectTitlesMap(rangeMap, range1, range2) {
 }
 function selectTitlesRange(map) {
     let mapArr = [];
-    
-    for(let i in map){
+
+    for (let i in map) {
         mapArr.push(i);
     }
 
-    mapArr.sort(function(a, b){ return a - b; });
+    mapArr.sort(function (a, b) { return a - b; });
 
     let rangeArr = [];
     let item = [];
 
-    if(mapArr.length > 1){
-        for(let j = 1; j < mapArr.length; j++){
-            if(mapArr[j] - mapArr[j - 1] == 1){
+    if (mapArr.length > 1) {
+        for (let j = 1; j < mapArr.length; j++) {
+            if (mapArr[j] - mapArr[j - 1] == 1) {
                 item.push(mapArr[j - 1]);
-                
-                if(j == mapArr.length - 1){
+
+                if (j == mapArr.length - 1) {
                     item.push(mapArr[j]);
                     rangeArr.push(item);
                 }
             }
-            else{
-                if(j == 1){
-                    if(j == mapArr.length - 1){
+            else {
+                if (j == 1) {
+                    if (j == mapArr.length - 1) {
                         item.push(mapArr[j - 1]);
                         rangeArr.push(item);
                         rangeArr.push([mapArr[j]]);
                     }
-                    else{
-                        rangeArr.push(mapArr[0]);    
+                    else {
+                        rangeArr.push(mapArr[0]);
                     }
                 }
-                else if(j == mapArr.length - 1){
+                else if (j == mapArr.length - 1) {
                     item.push(mapArr[j - 1]);
                     rangeArr.push(item);
                     rangeArr.push([mapArr[j]]);
                 }
-                else{
+                else {
                     item.push(mapArr[j - 1]);
                     rangeArr.push(item);
-                    item = [];       
+                    item = [];
                 }
             }
         }
     }
-    else{
+    else {
         rangeArr.push([mapArr[0]]);
     }
 
@@ -308,26 +299,26 @@ function selectTitlesRange(map) {
 
 //选区是否重叠
 function selectIsOverlap(range) {
-    if(range == null){
+    if (range == null) {
         range = Store.luckysheet_select_save;
     }
 
     let overlap = false;
     let map = {};
 
-    for(let s = 0; s < range.length; s++){
-        let str_r = range[s].row[0], 
+    for (let s = 0; s < range.length; s++) {
+        let str_r = range[s].row[0],
             end_r = range[s].row[1];
-        let str_c = range[s].column[0], 
+        let str_c = range[s].column[0],
             end_c = range[s].column[1];
 
-        for(let r = str_r; r <= end_r; r++){
-            for(let c = str_c; c <= end_c; c++){
-                if((r + "_" + c) in map){
+        for (let r = str_r; r <= end_r; r++) {
+            for (let c = str_c; c <= end_c; c++) {
+                if ((r + "_" + c) in map) {
                     overlap = true;
                     break;
                 }
-                else{
+                else {
                     map[r + "_" + c] = 0;
                 }
             }
@@ -336,32 +327,142 @@ function selectIsOverlap(range) {
 
     return overlap;
 }
-
+// 协同提示框
+function collaborativeEditBox() {
+    let all_width = Store.visibledatacolumn;//当前操作页的所有列距离左边的距离
+    let all_height = Store.visibledatarow;//当前操作页的所有列距离顶部的距离
+
+    Store.cooperativeEdit.changeCollaborationSize.forEach(value => {
+        if (value.i == Store.currentSheetIndex) {
+            let count_col = value.v.column;//系统提示框所在的列范围
+            let change_width = all_width[count_col[0]] -1 //提示框所在列号为0时要改变的宽
+            if(value.v.column[0] !== 0)  {
+                //用提示框右边框到图表最左的距离减去左边框到图表左边距离再减去边框值
+                change_width = all_width[count_col[1]] - all_width[count_col[0] - 1] - (count_col[1] - count_col[0] + 1)
+            }
+            let count_row = value.v.row;//系统提示框所在的行范围
+            let change_height = all_height[count_row[0]] -1
+            if(value.v.row[0] !== 0){
+                change_height = all_height[count_row[1]] - all_height[count_row[0] - 1] - (count_row[1] - count_row[0] + 1)
+            }
+            let range = Store.cooperativeEdit.merge_range //获取单元格合并后的数据
+            let change_left = all_width[value.v.column[0] - 1] - 1 //提示框离图表最左边的距离
+            let change_top = all_height[value.v.row[0] - 1] - 1 //提示框离图表最右边的距离
+            if (Store.config.columnlen !== null) {
+                //当改变宽的列不在提示框范围内时,将改变列的初始位置改为在提示框范围内
+                for (let k in Store.config.columnlen) {
+                    if (value.v.column[0] <= k && k <= value.v.column[1]) {
+                        Store.luckysheet_cols_change_size_start[1] = k - 0
+                        break
+                    }
+                }
+            }
+            if (Store.config.rowlen !== null) {
+                for (let k in Store.config.rowlen) {
+                    if (value.v.row[0] <= k && k <= value.v.row[1]) {
+                        Store.luckysheet_rows_change_size_start[1] = k - 0
+                        break
+                    }
+                }
+            }
+            // 改变列宽的位置在提示框范围内
+            let flag_width = value.v.column[0] <= Store.luckysheet_cols_change_size_start[1] && Store.luckysheet_cols_change_size_start[1] <= value.v.column[1]
+            if (flag_width) {
+                if (Store.luckysheet_cols_change_size_start[1] == 0) {
+                    change_width = all_width[0] - 1
+                } else {
+                    // 不在提示框范围内
+                    let counts = value.v.column;
+                    change_width = all_width[counts[1]] - all_width[counts[0] - 1] - (counts[1] - counts[0] + 1)
+                }
+            }
+            let flag_height = value.v.row[0] <= Store.luckysheet_rows_change_size_start[1] && Store.luckysheet_rows_change_size_start[1] <= value.v.row[1]
+            if (flag_height) {
+                if (Store.luckysheet_rows_change_size_start[1] == 0) {
+                    change_height = all_height[0] - 1
+                } else {
+                    let counts = value.v.row;
+                    change_height = all_height[counts[1]] - all_height[counts[0] - 1] - (counts[1] - counts[0] + 1)
+                }
+            }
+            //合并单元格时执行
+            if (Object.keys(range).length > 0 ) {
+                let flag_sure_merge = false
+                if(range.v.length > 1) {
+                    flag_sure_merge = Object.keys(range.v[1][0]).length > 0
+                }
+                if(range.v[0].length > 1) {
+                    flag_sure_merge = Object.keys(range.v[0][1]).length > 0
+                }
+                if(flag_sure_merge) {
+                    // 合并成一个时执行
+                    let flag_merge_width = range.column[0] <= value.v.column[0] && range.column[1] >= value.v.column[1];
+                    change_left = all_width[range.column[0] - 1] - 1
+                    change_top = all_height[range.row[0] - 1] - 1
+                    change_width = all_width[range.column[1]] - 1
+                    change_height = all_height[range.row[1]] - 1
+                    if (flag_merge_width) {
+                        if (range.column[0] !== 0) {
+                            let counts = range.column;
+                            change_width = all_width[counts[1]] - all_width[counts[0] - 1] - (counts[1] - counts[0] + 1)
+                        } else {
+                            change_left = 0
+                        }
+                        value.v.column = range.column
+                    }
+                    let flag_merge_height = range.row[0] <= value.v.row[0] && range.row[1] >= value.v.row[1];
+                    if (flag_merge_height) {
+                        if (range.row[0] !== 0) {
+                            let counts = range.row;
+                            change_height = all_height[counts[1]] - all_height[counts[0] - 1] - (counts[1] - counts[0] + 1)
+                        } else {
+                            change_top = 0
+                        }
+                        value.v.row = range.row
+                    }
+                } else {
+                    // 合并取消变成多个单元格时执行
+                    change_width = all_width[count_col[0]] - all_width[count_col[0] - 1] -1 
+                    if(count_col[0] === 0) {
+                        change_width = all_width[count_col[0]] - 1
+                    }
+                    change_height = all_height[count_row[0]] - all_height[count_row[0] - 1] -1 
+                    if(count_row[0] === 0) {
+                        change_height = all_height[count_row[0]] - 1
+                    }
+                }
+            }
+            $("#luckysheet-multipleRange-show-" + value.id).css({ "height": change_height, "width": change_width, "top": change_top + 'px', "left": change_left + 'px' })
+            let change_bottom = $("#luckysheet-multipleRange-show-" + value.id)[0].offsetHeight - 1
+            $("#luckysheet-multipleRange-show-" + value.id + ">.username").css({ "bottom": change_bottom + 'px' })
+        }
+    })
+}
 //复制选区虚线框
 function selectionCopyShow(range) {
     $("#luckysheet-selection-copy").empty();
 
-    if(range == null){
+    if (range == null) {
         range = Store.luckysheet_selection_range;
     }
 
-    if(range.length > 0){
-        for(let s = 0; s < range.length; s++){
+    if (range.length > 0) {
+        for (let s = 0; s < range.length; s++) {
             let r1 = range[s].row[0], r2 = range[s].row[1];
             let c1 = range[s].column[0], c2 = range[s].column[1];
 
-            let row = Store.visibledatarow[r2], 
+            let row = Store.visibledatarow[r2],
                 row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
-            let col = Store.visibledatacolumn[c2], 
+            let col = Store.visibledatacolumn[c2],
                 col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];
 
-            let copyDomHtml = '<div class="luckysheet-selection-copy" style="display: block; left: '+ col_pre +'px; width: '+ (col - col_pre - 1) +'px; top: '+ row_pre +'px; height: '+ (row - row_pre - 1) +'px;">'+
-                                '<div class="luckysheet-selection-copy-top luckysheet-copy"></div>'+
-                                '<div class="luckysheet-selection-copy-right luckysheet-copy"></div>'+
-                                '<div class="luckysheet-selection-copy-bottom luckysheet-copy"></div>'+
-                                '<div class="luckysheet-selection-copy-left luckysheet-copy"></div>'+
-                                '<div class="luckysheet-selection-copy-hc"></div>'+
-                              '</div>';
+            let copyDomHtml = '<div class="luckysheet-selection-copy" style="display: block; left: ' + col_pre + 'px; width: ' + (col - col_pre - 1) + 'px; top: ' + row_pre + 'px; height: ' + (row - row_pre - 1) + 'px;">' +
+                '<div class="luckysheet-selection-copy-top luckysheet-copy"></div>' +
+                '<div class="luckysheet-selection-copy-right luckysheet-copy"d></iv>' +
+                '<div class="luckysheet-selection-copy-bottom luckysheet-copy"></div>' +
+                '<div class="luckysheet-selection-copy-left luckysheet-copy"></div>' +
+                '<div class="luckysheet-selection-copy-hc"></div>' +
+                '</div>';
             $("#luckysheet-selection-copy").append(copyDomHtml);
         }
     }
@@ -369,11 +470,11 @@ function selectionCopyShow(range) {
 
 //选区行列数显示
 function luckysheet_count_show(left, top, width, height, rowseleted, columnseleted) {
-    let rowl = rowseleted[1] - rowseleted[0] + 1, 
+    let rowl = rowseleted[1] - rowseleted[0] + 1,
         coll = columnseleted[1] - columnseleted[0] + 1;
-    let drawWidth = Store.luckysheetTableContentHW[0], 
+    let drawWidth = Store.luckysheetTableContentHW[0],
         drawHeight = Store.luckysheetTableContentHW[1];
-    let scrollWidth = $("#luckysheet-cell-main").scrollLeft(), 
+    let scrollWidth = $("#luckysheet-cell-main").scrollLeft(),
         scrollHeight = $("#luckysheet-cell-main").scrollTop();
 
     const _locale = locale();
@@ -394,7 +495,7 @@ function luckysheet_count_show(left, top, width, height, rowseleted, columnselet
             topv = scrollHeight + drawHeight / 2;
         }
 
-        $("#luckysheet-row-count-show").css({ "left": leftv, "top": topv, "display": "block","width":"11px" }).html("<div>" + rowl.toString().split("").join("</div><div>") + "</div><div>"+locale_info.row+"</div>");
+        $("#luckysheet-row-count-show").css({ "left": leftv, "top": topv, "display": "block", "width": "11px" }).html("<div>" + rowl.toString().split("").join("</div><div>") + "</div><div>" + locale_info.row + "</div>");
     }
     else {
         $("#luckysheet-row-count-show").hide();
@@ -422,19 +523,19 @@ function luckysheet_count_show(left, top, width, height, rowseleted, columnselet
     }
 }
 
-function selectHelpboxFill(){
+function selectHelpboxFill() {
     let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
     let rf = range["row_focus"], cf = range["column_focus"];
-    if(Store.config["merge"] != null && (rf + "_" + cf) in Store.config["merge"]){
+    if (Store.config["merge"] != null && (rf + "_" + cf) in Store.config["merge"]) {
         $("#luckysheet-helpbox-cell").text(getRangetxt(Store.currentSheetIndex, {
-            column:[cf, cf],
-            row:[rf, rf],
+            column: [cf, cf],
+            row: [rf, rf],
         }));
     }
-    else{
+    else {
         $("#luckysheet-helpbox-cell").text(getRangetxt(Store.currentSheetIndex, range));
     }
-    
+
 }
 
 export {
@@ -442,6 +543,7 @@ export {
     selectHightlightShow,
     selectIsOverlap,
     selectionCopyShow,
+    collaborativeEditBox,
     luckysheet_count_show,
     selectHelpboxFill
 }
\ No newline at end of file
diff --git a/src/controllers/server.js b/src/controllers/server.js
index d99d5ed0e..a42e90c41 100644
--- a/src/controllers/server.js
+++ b/src/controllers/server.js
@@ -10,10 +10,11 @@ import luckysheetPostil from './postil';
 import { getObjType, replaceHtml, getByteLen } from '../utils/util';
 import { getSheetIndex } from '../methods/get';
 import Store from '../store';
+import { collaborativeEditBox } from './select'
 import locale from '../locale/locale';
 import dayjs from "dayjs";
 import imageCtrl from './imageCtrl';
-import method from '../global/method';
+import json from '../global/json';
 
 const server = {
     gridKey: null,
@@ -77,7 +78,6 @@ const server = {
 	    }
 	},
     saveParam: function (type, index, value, params) {
-		
     	let _this = this;
 
 	    if(!_this.allowUpdate){
@@ -98,7 +98,6 @@ const server = {
 			return;
 		}
 
-		
 	    if (type == "rv") { //单元格批量更新
 	        d.range = params.range;
 	    }
@@ -155,10 +154,11 @@ const server = {
 
 	        //连接建立时触发
 	        _this.websocket.onopen = function() {
-	            console.info(locale().websocket.success);
-	            hideloading();
-	            _this.wxErrorCount = 0;
 
+	        console.info(locale().websocket.success);
+	        hideloading();
+				  _this.wxErrorCount = 0;
+				
 	            //防止websocket长时间不发送消息导致断连
 	            setInterval(function(){
 	                _this.websocket.send("rub");
@@ -168,13 +168,19 @@ const server = {
 	        //客户端接收服务端数据时触发
 	        _this.websocket.onmessage = function(result){
 				Store.result = result
-				let data = new Function("return " + result.data )();
-				console.info(data);		
+				let data = eval('(' + result.data + ')');
+				console.info(data);
 				let type = data.type;
 				let {message,id} = data;
 				// 用户退出时,关闭协同编辑时其提示框
 				if(message === '用户退出') {
 					$("#luckysheet-multipleRange-show-" + id).hide();
+					Store.cooperativeEdit.changeCollaborationSize = Store.cooperativeEdit.changeCollaborationSize.filter(value => {
+						return value.id != id
+					})
+					Store.cooperativeEdit.checkoutData = Store.cooperativeEdit.checkoutData.filter(value => {
+						return value.id != id
+					})
 				}
 	            if(type == 1){ //send 成功或失败
 
@@ -182,38 +188,109 @@ const server = {
 	            else if(type == 2){ //更新数据
 	                let item = JSON.parse(data.data);
 					_this.wsUpdateMsg(item);
+					let chang_data = JSON.parse(data.data)
+					if(chang_data.k == 'columnlen') {
+						collaborativeEditBox(chang_data.v,null)
+					} else if(chang_data.k == 'rowlen') {
+						collaborativeEditBox(null,chang_data.v)
+					}
 	            }
 	            else if(type == 3){ //多人操作不同选区("t": "mv")(用不同颜色显示其他人所操作的选区)
 	                let id = data.id;
 	                let username = data.username;
 	                let item = JSON.parse(data.data);
-
 	                let type = item.t,
 	                    index = item.i,
 	                    value = item.v;
-
+					if(Store.cooperativeEdit.changeCollaborationSize.length === 0) {
+						Store.cooperativeEdit.changeCollaborationSize.push({id:id,v:item.v[0],i:index})
+					}	 
+					let flag = Store.cooperativeEdit.changeCollaborationSize.some(value1 => {
+						return value1.id == id
+					})
+					if(flag) {
+						Store.cooperativeEdit.changeCollaborationSize.forEach(val => {
+							if(val.id == id) {
+								val.v = item.v[0]
+								val.i = index
+							}
+						})  
+					} else {
+						Store.cooperativeEdit.changeCollaborationSize.push({id:id,v:item.v[0],i:index})
+					}		
 	                if(getObjType(value) != "array" && getObjType(value) !== "object"){
 	                    value = JSON.parse(value);
-	                }
-
+					}
+					let r = 0
+					let c = 0
 					if(index == Store.currentSheetIndex){//发送消息者在当前页面
 
 						if(getObjType(value) === "object" && value.op === 'enterEdit'){
-
-							let r = value.range[value.range.length - 1].row[0];
-							let c = value.range[value.range.length - 1].column[0];
-	
+							r = value.range[value.range.length - 1].row[0];
+							c = value.range[value.range.length - 1].column[0];
 							_this.multipleRangeShow(id, username, r, c, value.op);
 						
-						}else{
+						}else {
 
-							let r = value[value.length - 1].row[0];
-							let c = value[value.length - 1].column[0];
+							r = value[value.length - 1].row[0];
+							c = value[value.length - 1].column[0];
 	
 							_this.multipleRangeShow(id, username, r, c);
 						
 						}
-	                }
+						
+					} else {
+						if(getObjType(value) === "object" && value.op === 'enterEdit'){
+							r = value.range[value.range.length - 1].row[0];
+							c = value.range[value.range.length - 1].column[0];
+						}else {
+							r = value[value.length - 1].row[0];
+							c = value[value.length - 1].column[0];
+						}
+					}
+
+					if(Store.cooperativeEdit.checkoutData.length === 0) {
+						if(value.op) {
+							Store.cooperativeEdit.checkoutData.push({id,username,r,c,op:value.op,index})
+						} else {
+							Store.cooperativeEdit.checkoutData.push({id,username,r,c,index})
+						}
+					}
+					let checkoutFlag = Store.cooperativeEdit.checkoutData.some(item => {
+						return item.id == id
+					})
+					if(checkoutFlag) {
+						Store.cooperativeEdit.checkoutData.forEach(item => {
+							if(item.id == id) {
+								item.username = username
+								item.r = r
+								item.c = c
+								item.index = index
+								if (value.op === 'enterEdit') {
+									item.op = value.op
+								}
+							}
+						})
+					} else {
+						if(value.op === 'enterEdit') {
+							Store.cooperativeEdit.checkoutData.push({id,username,r,c,op:value.op,index})
+						} else {
+							Store.cooperativeEdit.checkoutData.push({id,username,r,c,index})
+						}
+					}
+
+					//其他客户端切换页面时
+					Store.cooperativeEdit.checkoutData.forEach(item => {
+						if(item.index != Store.currentSheetIndex) {
+							$("#luckysheet-multipleRange-show-" + item.id).hide();
+							item.op == ''
+						}
+					})
+
+					if($("#luckysheet-multipleRange-show-" + id)[0]) {
+						let change_bottom = $("#luckysheet-multipleRange-show-" + id)[0].offsetHeight - 1
+						$("#luckysheet-multipleRange-show-" + id + ">.username").css({"bottom":change_bottom + 'px'})
+					}
 	            }
 	            else if(type == 4){ //批量指令更新
 					// let items = JSON.parse(data.data);
@@ -286,7 +363,12 @@ const server = {
 	            }, 1);
 	        }
 	    }
-	    else if(type == "rv"){ //范围单元格数据更新
+		else if(type == "rv"){ //范围单元格数据更新
+			if(Object.keys(item.range).length > 0) {
+				Store.cooperativeEdit.merge_range = item.range
+				Store.cooperativeEdit.merge_range.v = item.v
+				collaborativeEditBox();
+			}
 	        if(file.data == null || file.data.length == 0){
 	            return;
 	        }
@@ -302,7 +384,7 @@ const server = {
 
 	        if(index == Store.currentSheetIndex){//更新数据为当前表格数据
 	            Store.flowdata = file.data;
-
+				
 	            //如果更新的单元格有批注
 	            for(let r = r1; r <= r2; r++){
 	                for(let c = c1; c <= c2; c++){
@@ -318,13 +400,13 @@ const server = {
 	            setTimeout(function () {
 	                luckysheetrefreshgrid();
 	            }, 1);
-	        }
+			}
 	    }
 	    else if(type == "cg"){ //config更新(rowhidden,rowlen,columnlen,merge,borderInfo)
 	        let k = item.k;
 
 	        if(k == "borderInfo"){
-	            file["config"]["borderInfo"] = value;
+				file["config"]["borderInfo"] = value;
 	        }
 	        else{
 	            if(!(k in file["config"])){
@@ -437,7 +519,7 @@ const server = {
 	        let op = item.op, pos = item.pos;
 
 	        if(getObjType(value) != "object"){
-				value = new Function("return "+ value)();
+	            value = eval('('+ value +')');
 	        }
 
 	        let r = value.r, c = value.c;
@@ -550,7 +632,7 @@ const server = {
 	                arr.push(JSON.stringify(addData[i]));
 	            }
 
-				new Function("return " + 'data.splice(' + st_i + ', 0, ' + arr.join(",") + ')')();
+	            eval('data.splice(' + st_i + ', 0, ' + arr.join(",") + ')');
 	        }
 	        else{
 	            file["column"] += len;
@@ -896,7 +978,6 @@ const server = {
             if(params.length==0){
                 return;
             }
-            console.log(params);
 
             params = encodeURIComponent(JSON.stringify(params));
             let compressBeginLen = params.length;
@@ -907,10 +988,10 @@ const server = {
             // }
             _this.requestLock = true;
             //console.log(params);
-            console.log("request");
+            // console.log("request");
             if(_this.updateUrl != ""){
                 $.post(_this.updateUrl, { compress: iscommpress, gridKey: _this.gridKey, data: params }, function (data) {
-					let re = new Function("return " + data)();
+                    let re = eval('('+ data +')')
                     if(re.status){
                         $("#luckysheet_info_detail_update").html("最近存档时间:"+ dayjs().format("M-D H:m:s"));
                         $("#luckysheet_info_detail_save").html("同步成功");
@@ -970,7 +1051,7 @@ const server = {
             if(_this.updateImageUrl != ""){
                 // $.post(_this.updateImageUrl, { compress: true, gridKey: _this.gridKey, data:data1  }, function (data) {
                 $.post(_this.updateImageUrl, { compress: false, gridKey: _this.gridKey, data:data1  }, function (data) {
-					let re = new Function("return " + data)();
+                    let re = eval('('+ data +')')
                     if(re.status){
                         imageRequestLast = dayjs();
                     }
@@ -1183,6 +1264,17 @@ const server = {
                 // });
             });
         });
+	},
+	keepHighLightBox: function() {
+        Store.cooperativeEdit.checkoutData.forEach(value => {
+            if(value.index == Store.currentSheetIndex) {
+                if(value.op === 'enterEdit') {
+                    server.multipleRangeShow(value.id, value.username, value.r, value.c, value.op);
+                } else {
+                    server.multipleRangeShow(value.id, value.username, value.r, value.c);
+                }
+            }
+        })
     }
 }
 
diff --git a/src/controllers/sheetBar.js b/src/controllers/sheetBar.js
index e49bc0b3b..231b1e9b8 100644
--- a/src/controllers/sheetBar.js
+++ b/src/controllers/sheetBar.js
@@ -71,7 +71,7 @@ function showsheetconfigmenu() {
                     redo["oldcolor"] = oldcolor;
                     redo["color"] = color;
                     
-                    Store.jfundo.length  = 0;
+                    Store.jfundo = [];
                     Store.jfredo.push(redo);
                 }
             }
@@ -96,7 +96,7 @@ function showsheetconfigmenu() {
                 redo["oldcolor"] = oldcolor;
                 redo["color"] = null;
 
-                Store.jfundo.length  = 0;
+                Store.jfundo = [];
                 Store.jfredo.push(redo);
             }
         });
@@ -199,6 +199,7 @@ export function initialSheetBar(){
             }, 200);
         }
     }).on("click", "div.luckysheet-sheets-item", function (e) {
+    
         if(isEditMode()){
             // alert("非编辑模式下不允许该操作!");
             return;
@@ -206,8 +207,7 @@ export function initialSheetBar(){
         
         let $t = $(this), $cur = $(e.target);
         luckysheetsheetrightclick($t, $cur, e);
-        // let result = Store.result
-        // server.websocket.onmessage(result)
+        server.keepHighLightBox()
     });
 
     let luckysheetsheetnameeditor = function ($t) {
@@ -266,7 +266,7 @@ export function initialSheetBar(){
             redo["oldtxt"] = oldtxt;
             redo["txt"] = txt;
 
-            Store.jfundo.length  = 0;
+            Store.jfundo = [];
             Store.jfredo.push(redo);
         }
     });
@@ -443,6 +443,7 @@ export function initialSheetBar(){
                     sheetmanage.setSheetShow(index);
                     sheetmanage.locationSheet();
                 }
+                server.keepHighLightBox()
             });
 
             initialOpenSheet = false;
diff --git a/src/global/api.js b/src/global/api.js
index 48aa23317..ad4ebcee0 100644
--- a/src/global/api.js
+++ b/src/global/api.js
@@ -4769,7 +4769,7 @@ export function setSheetActive(order, options = {}) {
             success();
         }
     }, 1);
-
+    server.multipleRangeShow()
     return file;
 }
 
diff --git a/src/global/refresh.js b/src/global/refresh.js
index ba56925f1..5cfb75420 100644
--- a/src/global/refresh.js
+++ b/src/global/refresh.js
@@ -15,7 +15,7 @@ import sheetmanage from '../controllers/sheetmanage';
 import luckysheetPostil from '../controllers/postil';
 import dataVerificationCtrl from '../controllers/dataVerificationCtrl';
 import hyperlinkCtrl from '../controllers/hyperlinkCtrl';
-import { selectHightlightShow, selectionCopyShow } from '../controllers/select';
+import { selectHightlightShow, selectionCopyShow, collaborativeEditBox } from '../controllers/select';
 import { createFilterOptions } from '../controllers/filter';
 import { getSheetIndex } from '../methods/get';
 import Store from '../store';
@@ -378,7 +378,7 @@ function jfrefreshrange(data, range, cdformat) {
 //删除、增加行列 刷新表格
 function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, af, freezen, dataVerification, hyperlink){
     let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
-
+    collaborativeEditBox();
     //merge改变对应的单元格值改变
     let mcData = [];
     for(let m in cfg["merge"]){
@@ -606,6 +606,7 @@ function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf,
 function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVerification, hyperlink){
     let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
     clearTimeout(refreshCanvasTimeOut);
+    collaborativeEditBox();
     //merge改变对应的单元格值改变
     let mcData = [];
     if(JSON.stringify(cfg["merge"]) == "{}"){
@@ -985,13 +986,13 @@ function jfrefreshgrid_rhcw(rowheight, colwidth, isRefreshCanvas=true){
 
         Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;
     }
-
+    
     //批注框同步
     luckysheetPostil.positionSync();
-
     //选区同步
     selectHightlightShow();
-
+    // 协同提示框同步
+    collaborativeEditBox();
     //改变单元格行高,复制虚线框同步
     if($(".luckysheet-selection-copy").is(":visible")){
         selectionCopyShow();
diff --git a/src/global/tooltip.js b/src/global/tooltip.js
index 74c563dcd..92709573d 100644
--- a/src/global/tooltip.js
+++ b/src/global/tooltip.js
@@ -2,6 +2,7 @@ import { modelHTML, luckysheetchartpointconfigHTML, luckysheetToolHTML } from '.
 import browser from './browser';
 import { replaceHtml } from '../utils/util';
 import locale from '../locale/locale';
+import server from '../controllers/server';
 
 const tooltip = {
     info: function (title, content) {
@@ -58,6 +59,7 @@ const tooltip = {
             if (typeof func1 == 'function') {
                 func1();
             }
+            server.keepHighLightBox();
             $("#luckysheet-confirm").hide();
             $("#luckysheet-modal-dialog-mask").hide();  
         });
diff --git a/src/store/index.js b/src/store/index.js
index 820c9b7d2..82e5f9716 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -141,7 +141,11 @@ const Store = {
     cooperativeEdit:{
         usernameTimeout:{
 
-        }
+        },
+        changeCollaborationSize:[], //改变行高或者列宽时,协同提示框需要跟随改变所需数据
+        allDataColumnlen:[],//列宽发生过改变的列
+        merge_range:{},//合并时单元格信息
+        checkoutData:[],//切换表格页时所需数据
     }
 
 }