2012-06-14 30 views
7

在Google文檔電子表格中。 如果合併單元格A1 & A2,是否有方法 以確認它們已合併,請使用google apps腳本?如何知道電子表格單元格是否使用Google應用程序腳本進行合併

有氣體https://developers.google.com/apps-script/class_range#merge

合併功能,但沒有任何功能或示例演示瞭如何檢查是否細胞被合併。

getValues等只是爲單元格返回一個空字符串。例如這 不起作用。

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(); 


} 

回答

2

range.isPartOfMerge()

看來.isPartOfMerge()方法was implemented(2016年9月11日)。

所以,你可以檢查的範圍被合併爲這樣:

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()); 
} 

文檔https://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge


OLD APPROACH

在這裏張貼的另一種方法,我更喜歡比接受的答案。

如果您嘗試使用GAS將值存儲在合併範圍的單元格中,但第一個單元格除外,它將不會存儲它。

因此,我們可以利用這一點,並試圖保存價值,並檢查它是否被儲存,使用類似這樣的一個功能:

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 
} 

我已經進行了一系列的快速測試,它返回true/false據此,但有一個限制,我沒有時間涵蓋: 如果你有一個合併範圍像"A1:F1",你檢查的範圍"A1:G1"(這樣,一個多列),它將返回true,甚至如果G1不是合併範圍的一部分 - 因爲它僅使用第一個綁定行/列作爲引用來檢查下一列。

+0

好找。 ...我猜這可以用新的樣式表而不是舊式樣。由於問題中的代碼已經檢查了這個想法,並顯示它在舊樣式表中失敗,但是我沒有使用新樣式表進行測試。 – eddyparkinson

3

這是不可能知道的。已經開通了issue,但這已經很老了,沒有任何活動。你應該明白它(保持追蹤更新和投票類型),並留下評論,看看你是否能得到一些關注。

但是,當我需要確保合併的單元格時,我所做的就像我希望它們打破一切並再次合併,只是爲了確保。當然,這不是一個解決方案,只是一個可能適合你的想法。

+0

恩裏克,我終於找到了解決方案。所以標記爲正確的答案。 – eddyparkinson

0

以HTML格式下載:您可以下載工作表爲HTML,這將包括合併的單元格信息。不是一個好的解決方案,但它的工作。

實施例下載網址:

docs.google.com/feeds/download/spreadsheets/Export?key=* spreadsheetkey * & exportFor墊= HTML & GID = 3

其中GID是工作表gid號碼。 - 登錄名是否通過谷歌驅動API要求(見谷歌驅動DrEdit教程詳細信息)

+0

並從HTML中可以驗證哪些單元格被合併?任何洞察(例如,他們設置rowspan)?我問這是你原來的問題。 –

+0

是的,HTML包含合併單元格的rowspan和colspan。易於測試,使用上面的URL,更改密鑰,如果您登錄,它會下載。(gid是可選的,它選擇表單)。 – eddyparkinson

0

發現這個解決方案,貼在這裏:
https://code.google.com/p/google-apps-script-issues/issues/detail?id=618

只適用於有效範圍

// 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

如果有人在這裏需要解決這個問題,我寫了一個小工具,它可以讓大多數驢子不用從導出的HTML中生成所有合併單元格的關鍵值文件。

你可以在這裏找到:https://github.com/martinhbramwell/CellMergeWorkAround

我寫的,因爲我有一個小項目,取決於是否能夠完全克隆的範圍從一個電子表格到另一個。顯然,我已經加入了我的投票,希望這個問題得到解決。

(注意:我會將此添加爲正確答案的評論,但缺少必要的觀點。)

1

似乎有一個解決方法是利用合併單元總是返回白色背景的事實。下面的代碼似乎適用於我;如果有人能夠確認,我將不勝感激。

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

也許這有點晚,因爲我沒有看到新版Google電子表格的這個問題。但是,我仍然在爲我的項目使用舊的電子表格版本。所以我需要以某種方式弄清楚。

我需要爲新列複製上一列的格式。這是下面的代碼部分:

 // 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; 
     } 
     } 

所以,最重要的部分在這裏:

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

如果這是不可能複製這些細胞,它只是繼續尋找別人。

相關問題