2012-06-14 14 views
7

Trong bảng tính tài liệu Google. Nếu các ô A1 & A2 được hợp nhất, có cách nào để xác nhận chúng được hợp nhất hay không, sử dụng tập lệnh google apps?Làm cách nào để biết liệu các ô bảng tính có được hợp nhất hay không bằng cách sử dụng tập lệnh google apps

Có một chức năng merge trong GAS https://developers.google.com/apps-script/class_range#merge

Nhưng không có chức năng hoặc ví dụ cho thấy làm thế nào để kiểm tra xem các tế bào được sáp nhập.

getValues ​​v.v. chỉ trả về một chuỗi trống cho ô. ví dụ. này không hoạt động.

function testMerge() { 

    var spreadsheet = SpreadsheetApp.openById('Z3ppTjxNUE........'); 
    var sheet = spreadsheet.getSheets()[0]; 
    var range = sheet.getRange("A3:A4"); 
    var values = range.getValues(); 
    var formulas = range.getFormulasR1C1(); 
    var formulasA1 = range.getFormulas(); 

    range = sheet.getRange("A4"); 
    range.setValue("a"); 

    range = sheet.getRange("A3:A4"); 
    var values2 = range.getValues(); 
    var formulas2 = range.getFormulasR1C1(); 
    var formulasA12 = range.getFormulas(); 


    var count = range.getHeight(); 


} 

Trả lời

2

range.isPartOfMerge()

Có vẻ như .isPartOfMerge() phương pháp was implemented (11 tháng 9 năm 2016).

Vì vậy, bạn có thể kiểm tra nếu một phạm vi được sáp nhập như vậy:

function testMerge() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Sheet1"); 
    var range = sheet.getRange(1,1,2); // example for cells A1 and A2 
    Logger.log(range.isPartOfMerge()); 
} 

Documentshttps://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge


OLD TIẾP CẬN

viết bài ở đây một cách tiếp cận mà tôi thích hơn hơn câu trả lời được chấp nhận.

Nếu bạn cố gắng sử dụng GAS để lưu trữ giá trị trong ô của phạm vi được hợp nhất, ngoại trừ ô đầu tiên, nó sẽ không lưu trữ.

Như vậy, chúng ta có thể khai thác này và cố gắng để lưu trữ các giá trị và kiểm tra xem nó đã được lưu trữ, sử dụng một chức năng tương tự như này:

function isMerged(range){ 
    try { 
    range.getDataSourceUrl() 
    } catch (err) { 
    throw "isMerged function only works with valid GAS Range objects" 
    } 
    var sheet = range.getSheet(); 
    var rangeData = range.getValues(); 

    var testValue = "testing merge"; 

    if (rangeData.length == 1 && rangeData[0].length == 1) return false; // we have a single cell. Can't possible be merged :) 

    if (rangeData.length == 1) { 
    // We have a single row. Which means we're testing a row with multiple columns 
    var mainCell=range.getA1Notation().split(":")[0]; 
    var rowNumber= sheet.getRange(mainCell).getRow(); 
    var nextColNumber = sheet.getRange(mainCell).getColumn()+1; 
    var row = rangeData[0]; 
    var oldValue = row[1]; // for testing purposes, we're chosing the next possible column 

    sheet.getRange(rowNumber,nextColNumber).setValue(testValue); 
    if (sheet.getRange(rowNumber,nextColNumber).getValue() !== testValue) { 
     return true; 
    } else { 
     sheet.getRange(rowNumber,nextColNumber).setValue(oldValue); 
     return false; 
    }; 
    } else if (rangeData[0].length == 1) { 
    // We have multiple rows and a single column. 
    var mainCell=range.getA1Notation().split(":")[0]; 
    var nextRowNumber= sheet.getRange(mainCell).getRow()+1; 
    var colNumber = sheet.getRange(mainCell).getColumn(); 
    var oldValue = rangeData[1][0]; // for testing purposes, we're chosing the next possible row 

    sheet.getRange(nextRowNumber,colNumber).setValue(testValue); 
    if (sheet.getRange(nextRowNumber,colNumber).getValue() !== testValue) { 
     return true; 
    } else { 
     sheet.getRange(nextRowNumber,colNumber).setValue(oldValue); 
     return false; 
    }; 
    } else { 
    // We have multiple rows and multiple columns 
    var mainCell=range.getA1Notation().split(":")[0]; 
    var nextRowNumber= sheet.getRange(mainCell).getRow()+1; 
    var nextColNumber = sheet.getRange(mainCell).getColumn()+1; 
    var oldValue = rangeData[1][1]; // for testing purposes, we're chosing the next possible row and next possible column 

    sheet.getRange(nextRowNumber,nextColNumber).setValue(testValue); 
    if (sheet.getRange(nextRowNumber,nextColNumber).getValue() !== testValue) { 
     return true; 
    } else { 
     sheet.getRange(nextRowNumber,nextColNumber).setValue(oldValue); 
     return false; 
    }; 
    } 

    // if none of these checks worked, something's fishy. Either way, return false 
    return false 
} 

Tôi đã chạy một loạt các bài kiểm tra nhanh chóng và nó trả lại true/false cho phù hợp, nhưng có giới hạn rằng tôi không có thời gian để bao gồm: Nếu bạn có phạm vi hợp nhất như "A1:F1" và bạn đã kiểm tra phạm vi "A1:G1" (do đó, một cột nữa), nó sẽ trả về true, thậm chí nếu G1 không phải là một phần của phạm vi hợp nhất - bởi vì nó chỉ kiểm tra cột tiếp theo sử dụng như tham chiếu hàng/cột bị ràng buộc đầu tiên.

+0

Tìm tốt. ... Tôi đoán nó hoạt động với những tấm phong cách mới chứ không phải kiểu cũ. Vì mã trong câu hỏi đã kiểm tra ý tưởng này và cho thấy nó không thành công với bảng định kiểu cũ, nhưng tôi chưa thử nghiệm nó với các tờ định kiểu mới. – eddyparkinson

3

Không thể biết điều đó. Đã có issue mở về điều này, nhưng nó khá cũ và không có hoạt động. Bạn nên gắn dấu sao (để theo dõi các cập nhật và loại phiếu bầu cho nó) và để lại nhận xét để xem liệu bạn có thể thu hút được sự chú ý hay không.

Nhưng những gì tôi làm khi tôi cần đảm bảo các ô đã phối giống như tôi muốn chúng là chia nhỏ mọi thứ ra và hợp nhất lại, chỉ để chắc chắn. Tất nhiên, đây không phải là một giải pháp, chỉ là một ý tưởng có thể phù hợp với bạn.

+0

Henrique, tôi đã tìm thấy giải pháp cuối cùng. Vì vậy, đánh dấu nó như là câu trả lời đúng. – eddyparkinson

0

Tải xuống dưới dạng HTML: Bạn có thể tải xuống trang tính dưới dạng HTML, điều này sẽ bao gồm thông tin ô được hợp nhất. Không phải là một giải pháp tốt đẹp, nhưng nó hoạt động.

Ví dụ tải url:

docs.google.com/feeds/download/spreadsheets/Export?key=* spreadsheetkey * & exportFor mat = html & gid = 3

nơi gid là số gid của tờ. - signin được yêu cầu qua API Google Drive (xem Google Drive DrEdit Hướng dẫn để biết chi tiết)

+0

Và từ HTML, bạn có thể xác minh rằng ô nào được hợp nhất? Bất kỳ thông tin chi tiết nào về điều đó (ví dụ: họ đặt hàng rào)? Tôi hỏi vì đó là câu hỏi ban đầu của bạn. –

+0

Có, HTML chứa rowspan và colspan cho các ô đã phối. Dễ dàng kiểm tra, sử dụng URL ở trên, thay đổi khóa và nó sẽ tải xuống nếu bạn đã đăng nhập. (Gid là tùy chọn, nó sẽ chọn trang tính). – eddyparkinson

0

Tìm thấy giải pháp này, được đăng ở đây:
https://code.google.com/p/google-apps-script-issues/issues/detail?id=618

Nhưng chỉ hoạt động đối với phạm vi hoạt động

// This is my function to test the active range is merged or not and return 
// true or false by passing active range to it 
function ismerge() { 
    var spread = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = spread.getActiveSheet(); 
    var last_row = sheet.getActiveRange().getLastRow(); 
    var last_col = sheet.getActiveRange().getLastColumn(); 

    Logger.log("Last row: %s", last_row); 
    var active_row = sheet.getActiveRange().getRow(); 
    var active_col = sheet.getActiveRange().getColumn(); 
    Logger.log("Row: %s", active_row); 
    if ((last_row == active_row) && (last_col == active_col)) { 
    Logger.log("Cell not merged"); 
    return false; 
    } 
    else { 
    Logger.log("Cell merged"); 
    return true; 
    } 
} 
1

Nếu bất cứ ai ở đây cần một công việc xung quanh cho vấn đề này, tôi đã viết một công cụ nhỏ mà phần lớn công cụ lừa tạo ra một tệp giá trị khóa của tất cả các ô đã phối từ HTML được xuất.

Bạn có thể tìm thấy nó ở đây: https://github.com/martinhbramwell/CellMergeWorkAround

Tôi đã viết nó vì tôi có một dự án nhỏ mà phụ thuộc vào khả năng dãy đầy đủ bản sao từ một bảng tính khác. Rõ ràng, tôi đã thêm phiếu bầu của mình để muốn khắc phục sự cố.

(Lưu ý: Tôi đã thêm điều này làm nhận xét cho câu trả lời đúng, nhưng thiếu các điểm cần thiết.)

1

Dường như có cách giải quyết sự thật là các ô được hợp nhất luôn trả về nền trắng. Mã bên dưới dường như hoạt động với tôi; Tôi sẽ đánh giá cao nếu bất cứ ai có thể xác nhận.

function testMerged() { 
    var WHITE = '#ffffff'; 
    var NON_WHITE = '#fffffe'; 
    var range = SpreadsheetApp.getActiveSheet().getDataRange(); 
    range.setBackground(NON_WHITE); 
    range.getBackgrounds().forEach(function (row, rowNum) { 
    row.forEach(function (col, colNum) { 
     if (col === WHITE) { Logger.log('Cell merged at row ' + rowNum + ' col ' + colNum); } 
    }); 
    }); 
    range.setBackground(WHITE); 
} 
0

Có thể đó là một câu trả lời muộn vì tôi không thấy vấn đề này cho phiên bản mới của bảng tính google. Nhưng, tôi vẫn sử dụng phiên bản bảng tính cũ cho dự án của mình. Vì vậy, tôi đã cần bằng cách nào đó con số nó ra.

Tôi cần phải sao chép định dạng của cột trước đó cho các cột mới. Đây là một phần của mã bên dưới:

 // trying to find first column with week day (white background) 
     var background = ''; 
     for(var columnIndex = 3; columnIndex<=columnLetters.length; columnIndex++){ 
     background = sheet.getRange(1, columnIndex).getBackground(); 
     if(background == 'white' || background == ''){ 
      tmpRange = columnLetters[columnIndex]+':'+columnLetters[columnIndex]; 
      Logger.log('tmpRange: '+tmpRange); 
      // workaround to be able to copy format if there is some merged cells 
      try{ 
      Logger.log('try'); 
      // copy format of previous column 
      sheet.getRange(tmpRange).copyTo(
       sheet.getRange('B1'), {formatOnly:true} 
      ); 
      }catch(e) { 
      Logger.log('continue'); 
      continue; 
      } 
      Logger.log('break'); 
      break; 
     } 
     } 

Vì vậy, phần quan trọng nhất ở đây là:

try{ 
    Logger.log('try'); 
    // copy format of previous column 
    sheet.getRange(tmpRange).copyTo(
    sheet.getRange('B1'), {formatOnly:true} 
); 
}catch(e) { 
    Logger.log('continue'); 
    continue; 
} 

Nếu nó không thể sao chép các tế bào nó chỉ tiếp tục cho những người khác tìm kiếm.