Google Sheets文件导入:实现文件名填充至首列所有行
问题:导入文件至Google Sheets时,为每行首列添加文件名
我需要将文件夹中的文件导入到Google Sheets,要求导入前给每一行的首列添加对应的文件名,但当前脚本仅将文件名添加到首列的第一个单元格。
当前效果
| Filename | Pencil |
| 01/01/2022 | Pen |
| 01/02/2022 | Hat |
期望效果
| Filename | 1/01/2022 | Pencil |
| Filename | 1/01/2022 | Pen |
| Filename | 01/02/2022 | Hat |
当前使用的脚本代码
function Import_Kredo() { var arr = []; var files = DriveApp.getFolderById("13kymSiqX0-L6a9ev4It1_BEjH-xM8rnc").getFiles(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var copySheet = ss.getSheetByName("Table 1"); copySheet.getRange('A2:G').clear(); while (files.hasNext()) { var file = files.next(); var mimeType = file.getMimeType(); var ss1 = null, id = null; if (mimeType == MimeType.MICROSOFT_EXCEL) { id = Drive.Files.copy({ mimeType: MimeType.GOOGLE_SHEETS }, file.getId()).id; ss1 = SpreadsheetApp.openById(id); } else if (mimeType == MimeType.GOOGLE_SHEETS) { ss1 = SpreadsheetApp.open(file); } if (!ss1) continue; var sheet = ss1.getSheetByName("Table 1"); if (!sheet) continue; var sheetsRange = sheet.getDataRange(); var sheetsValues = sheetsRange.getValues().filter(r => r[1]).filter(e => e); var v = sheetsValues.slice(1); console.log([file.getName(), v]) arr = arr.concat([[file.getName(), ...Array(v[0].length - 1).fill(null)], ...v]); if (id) DriveApp.getFileById(id).setTrashed(true); // or Drive.Files.remove(id); } copySheet.getRange(5, 1, arr.length, arr[0].length).setValues(arr); }
修改后的脚本代码
function Import_Kredo() { var arr = []; var files = DriveApp.getFolderById("13kymSiqX0-L6a9ev4It1_BEjH-xM8rnc").getFiles(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var copySheet = ss.getSheetByName("Table 1"); copySheet.getRange('A2:G').clear(); while (files.hasNext()) { var file = files.next(); var mimeType = file.getMimeType(); var ss1 = null, id = null; if (mimeType == MimeType.MICROSOFT_EXCEL) { id = Drive.Files.copy({ mimeType: MimeType.GOOGLE_SHEETS }, file.getId()).id; ss1 = SpreadsheetApp.openById(id); } else if (mimeType == MimeType.GOOGLE_SHEETS) { ss1 = SpreadsheetApp.open(file); } if (!ss1) continue; var sheet = ss1.getSheetByName("Table 1"); if (!sheet) continue; var sheetsRange = sheet.getDataRange(); var sheetsValues = sheetsRange.getValues().filter(r => r[1]).filter(e => e); var v = sheetsValues.slice(1); console.log([file.getName(), v]) // 遍历每一行数据,给每行首列添加文件名 var modifiedRows = v.map(row => [file.getName(), ...row]); arr = arr.concat(modifiedRows); if (id) DriveApp.getFileById(id).setTrashed(true); // or Drive.Files.remove(id); } copySheet.getRange(5, 1, arr.length, arr[0].length).setValues(arr); }
修改说明
原代码中,arr = arr.concat([[file.getName(), ...Array(v[0].length - 1).fill(null)], ...v]) 这一行是先添加一行仅首列有文件名、其余列空的行,再拼接原数据行,导致只有第一行首列有文件名。
修改后通过v.map(row => [file.getName(), ...row])遍历每一行数据,给每行的最前面插入当前文件名,这样每一行的首列都会带上对应的文件名,符合期望效果。
内容的提问来源于stack exchange,提问作者Елена Желевская
相关产品推荐
相关产品推荐

