2017-06-12 79 views
1

我試圖在Google表格中取一行數據,並將其轉置到新工作表中的多行中。 See example spreadsheet。每行應該有一個產品的文件名。產品可以通過唯一的十六進制產品ID(文件名的前四個字符)進行區分。表單:將單列轉置爲多行

我認爲如果可以做到這一點,將使用ARRAYFORMULA和TRANSPOSE的組合來完成,但我想知道它是否實際上可以用標準Sheets公式完成。

我將粘貼的文件名列表可能始終在產品之間留有空行,因此任何公式/腳本都可以使用空白行或4個字符的ID來確定何時創建新行。

回答

1

正如您所說,這非常適合使用=TRANSPOSE函數。

使用Range.getValues()將給出一個二維數組,這對代碼中的轉置是微不足道的。例如,回答here

從那裏,設置寫憤怒以匹配轉置陣的尺寸,並且重複所希望的結果,那麼Range.setValues()

編輯

自定義功能。

/** 
* Pivots the list of images by image key 
* 
* @param {Range} range The range of values. Assumes a column. 
* @return The range of results as array per image key 
* @customfunction 
*/ 
function PIVOTIMAGES(range) { 
    var imagesByKey = {}; 

    range 
    .map(function(d){ return d[0]; }) // assumes single column 
    .filter(function(d) { return d && d != ''; }) // filters out blank rows 
    .forEach(function(d){ // arranges all images as an array per key 
    var key = d.split('_')[0]; // assumes key is always XXX_ 
    if (!imagesByKey[key]) { 
     imagesByKey[key] = [d]; 
    } else { 
     imagesByKey[key].push(d); 
    } 
    }); 

    return Object.keys(imagesByKey).map(function(key) { 
    return imagesByKey[key]; 
    }); 
} 

這需要一些工作來處理在一行中接收多列信息或信息而不是列,但原則上這是一個簡單的解決方案。

我已將它添加到您的示例表中。例如,將其用作公式=PIVOTIMAGES(A2:A10)

+0

感謝@Jonathon的迴應。我的理解是否正確,這是我必須處理的腳本,而不僅僅是公式?我只適應其他人的Google腳本,所以我想弄清楚如何推進實施。 –

+0

我不會打擾這個用例的腳本。任何時候公式都可以做到,它們最終會更清晰,更易於修改。 – Jonathon

+0

但是我可以在公式中使用'Range.getValues()'和'Range.setValues()'嗎? –

2

我發現了一個間接的解決方案。這不是很優雅,但它是我能找到的最好的。請參閱updated example spreadsheet的第三個標籤。我也添加了解釋性評論。

如果示例電子表格最終失去時間,下面是我用於子孫後代的公式的簡要概述。

在新工作表的A列中,我使用=left(Input!A1,4)公式來重現原始列表中每個文件名的前四個字符。

然後我使用=UNIQUE(FILTER(A:A,A:A<>""))從新工作表的A列創建產品ID的重複列表。

最後,我用的產品ID列表建立一個過濾器的公式,然後我可以轉,讓我想要的結果:=IF(ISBLANK(A1),"",TRANSPOSE(FILTER(Input!A$1:A,REGEXMATCH(Input!A$1:A,"^"&B1))))

正則表達式公式匹配任何啓動(2)用細胞產品ID B1。我添加了ISBLANK公式以避免在空行中出現錯誤。

+0

這是一個很好的解決方案,因爲它可以工作。優雅往往以易讀性爲代價。 – Jonathon