如何修改Google Apps Script提取列中名称并填充至目标列
问题
我编写了一段Google Apps Script代码,原本想把表格第4列内容处理后填充到第5列,但目前代码仅能原样复制内容。我需要将形如"SUIVI DU TEMPS_LOUISE_RODRIG"的内容提取出LOUISE_RODRIG部分(去掉前缀"SUIVI DU TEMPS_和末尾的引号),再填充到目标列,同时保留原有的空行填充逻辑(用上方非空值填充下方空行)。
初始表格
| 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| "SUIVI DU TEMPS_LOUISE_RODRIG" | ||||
| "SUIVI DU TEMPS_ANTHO_DACOSTA" | ||||
预期结果
| 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| "SUIVI DU TEMPS_LOUISE_RODRIG" | LOUISE_RODRIG | |||
| LOUISE_RODRIG | ||||
| LOUISE_RODRIG | ||||
| LOUISE_RODRIG | ||||
| LOUISE_RODRIG | ||||
| LOUISE_RODRIG | ||||
| "SUIVI DU TEMPS_ANTHO_DACOSTA" | ANTHO_DACOSTA | |||
| ANTHO_DACOSTA | ||||
| ANTHO_DACOSTA | ||||
| ANTHO_DACOSTA |
现有代码
function CREATE_NAME() { var COLsheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DATA_COLLECT"); //copy name var suivname = COLsheet.getRange(5,4,COLsheet.getLastRow()-1,1).getValues(); COLsheet.getRange(5,5, suivname.length, 1 ).setValues(suivname); //fill the empty lines var name = COLsheet.getRange(5,5,COLsheet.getLastRow()-1,1).getValues(); for( let i=1; i<name.length; i++ ) { if( name[i][0] === "" ) name[i][0] = name[i-1][0]; } COLsheet.getRange(5,5, name.length, 1 ).setValues(name); }
解决方案
你需要在获取第4列数据后,先对内容进行提取处理,再写入第5列。这里用正则表达式实现精准提取,同时保留原有的空行填充逻辑:
修改后的代码
function CREATE_NAME() { var COLsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DATA_COLLECT"); // 获取第4列数据并处理提取目标内容 var suivname = COLsheet.getRange(5, 4, COLsheet.getLastRow() - 1, 1).getValues(); // 遍历数据,提取需要的名字部分 var processedNames = suivname.map(row => { const original = row[0]; if (!original) return [""]; // 空内容直接返回空 // 正则匹配提取引号内前缀后的名字 const match = original.match(/^"SUIVI DU TEMPS_(.*)"$/); return match ? [match[1]] : [""]; // 匹配成功返回名字,否则返回空 }); // 将处理后的数据写入第5列 COLsheet.getRange(5, 5, processedNames.length, 1).setValues(processedNames); // 保留原有空行填充逻辑 var name = COLsheet.getRange(5, 5, COLsheet.getLastRow() - 1, 1).getValues(); for (let i = 1; i < name.length; i++) { if (name[i][0] === "") name[i][0] = name[i-1][0]; } COLsheet.getRange(5, 5, name.length, 1).setValues(name); }
关键修改说明
- 使用
map遍历原始数据,对每行内容做处理:- 正则表达式
/^"SUIVI DU TEMPS_(.*)"$/精准匹配目标格式,捕获SUIVI DU TEMPS_之后、末尾引号之前的内容。 - 空内容或不匹配格式的行直接返回空字符串,避免产生错误。
- 正则表达式
- 处理后的数组直接写入第5列,再执行原有的空行填充逻辑,即可得到预期结果。
内容的提问来源于stack exchange,提问作者antho2B
相关产品推荐
相关产品推荐

