我有一個夏令營網站。每次注冊都會自動在 Google 表格中結束。我想將注冊分成多行。
我為這個專案繼承的谷歌電子表格包括一列 C - H,在同一個單元格中列出了多個子資訊,用換行符分隔(即 CHAR(10) )。每行有一個注冊。單元格(C 列到 H 列)中的行數逐行變化。我的初始作業表如下所示:

我需要執行以下操作來優化此作業表:
拆分每個多行單元格,使每個子單元格出現在自己的行中。這需要在原始行下方插入新行。復制原始行上所有其他單元格的資料(即來自 A 列和 J:V 列),以便每個新行都包含子項的完整資料。我需要一個自動化流程 - 我將有大約 3000 個注冊要處理,因此無法通過任何手動步驟來完成。
該作業表應如下所示:

我試過在谷歌表格中使用這個自定義腳本,但沒有用:
function result(range) {
var splitCol = 1; // split on column B
var output2 = [];
for(var i=0, iLen=range.length; i<iLen; i ) {
var s = range[i][splitCol].split("\n");
for(var j=0, jLen=s.length; j<jLen; j ) {
var output1 = [];
for(var k=0, kLen=range[0].length; k<kLen; k ) {
if(k == splitCol) {
output1.push(s[j]);
} else {
output1.push(range[i][k]);
}
}
output2.push(output1);
}
}
return output2;
}
歡迎所有幫助!謝謝。
uj5u.com熱心網友回復:
試試下面的自定義函式。它逐行遍歷行,并在具有最多此類分隔值的行中的單元格中插入與分隔符分隔值一樣多的行。
該函式復制行,以便每個拆分值都在其自己的行中。不包含分隔符的列使用原始行中的值填充。
/**
* Expands data by splitting text strings that contain a separator character.
*
* Duplicates rows so that each split value is in its own row.
* Columns that do not contain the separator character are filled down
* using the value in the original row.
*
* @param {A2:D42} data The rows to expand.
* @param {char(10)} separator The character to split by.
* @customfunction
*/
function ExpandSplit(data, separator = '\n') {
// version 1.1, written by --Hyde, 7 December 2021
// - support multiple split columns
// - see https://stackoverflow.com/q/70258670/13045193
if (!Array.isArray(data)) {
throw new Error('ExpandSplit expected data to be a range or multiple rows.');
}
let expanded = [];
data.forEach(row => {
const numDupRows = Math.max(1, ...row.map(column => typeof column === 'string' && column.split(separator).length));
const duplicates = [];
row.forEach((column, columnIndex) => {
const splitString = String(column).split(separator);
for (let dupRow = 0; dupRow < numDupRows; dupRow ) {
if (!duplicates[dupRow]) {
duplicates[dupRow] = [];
}
if (typeof column === 'string' && splitString.length > 1) {
duplicates[dupRow][columnIndex] = splitString[dupRow] || null;
} else {
duplicates[dupRow][columnIndex] = column;
}
}
});
expanded = expanded.concat(duplicates);
});
return expanded;
}
uj5u.com熱心網友回復:
您可以使用此代碼作為指南。它只是采用給定的范圍并將其細分為盡可能多的行,因為它找到了\n分隔符。
const splitData = () => {
let ss = SpreadsheetApp.openById(SS_ID).getSheets()[0]
let rangeToSplit = ss.getRange('C2:H2')
let values = rangeToSplit.getValues()[0]
for(let i = 0 ; i < values.length; i ){
var cellValues = values[i].split('\n')
for ( let j = 0 ; j < cellValues.length ; j ) {
// 2 j refers to the rows 2,3,..
// 3 i refers to columns C,D,...
ss.getRange(2 j, 3 i).setValue(cellValues[j])
}
}
}
如果要容納此代碼以復制不包含換行符的單元格,則應嘗試添加某種控制機制,例如:
var content = ss.getRange(2 j, 1 i).getValue()
if (content.split('\n').length != 1) {
ss.getRange(2 j, 3 i).setValue(cellValues[j])
}
檔案:
getRange(row, column)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376102.html
下一篇:如何呼叫函式并使用它的回傳值?
