如何按ID将CSV指定列数据导入到Google Sheet指定工作表
实现方案
完全可以实现,直接用Google Sheet自带的Apps Script即可完成,无需第三方工具。
前置准备
- 把需要导入的CSV文件上传到你的Google Drive
- 记录下CSV文件的ID(打开Drive里的CSV,URL中
d/和/edit之间的字符串就是文件ID) - 提前确认好对应列的映射关系:CSV中要导入的列对应目标Google Sheet的哪一列,以及两边ID列的列名
可用脚本
打开你的目标Google Sheet,点击顶部菜单「扩展程序」>「Apps Script」,替换默认代码为以下内容:
function syncCsvColumnsToSheet() { // -------------------------- 以下为需要你修改的配置项 -------------------------- const CSV_FILE_ID = "替换为你的CSV文件ID"; const TARGET_SHEET_NAME = "替换为目标工作表名称,比如Sheet1"; const CSV_ID_COLUMN_NAME = "替换为CSV里ID列的列名,比如user_id"; const SHEET_ID_COLUMN_NAME = "替换为Google Sheet里ID列的列名,比如用户ID"; // 列映射:左边填CSV里的列名,右边填要同步到Google Sheet的列名,可加多个 const COLUMN_MAPPING = { "CSV里的列名1": "Sheet里的列名1", "CSV里的列名2": "Sheet里的列名2" }; // -------------------------- 配置项修改结束 -------------------------- // 读取并解析CSV文件 const csvFile = DriveApp.getFileById(CSV_FILE_ID); const csvContent = csvFile.getBlob().getDataAsString(); const csvRows = Utilities.parseCsv(csvContent); const csvHeaders = csvRows[0].map(h => h.trim()); const csvIdIndex = csvHeaders.indexOf(CSV_ID_COLUMN_NAME); const csvColumnIndexes = {}; Object.keys(COLUMN_MAPPING).forEach(csvCol => { csvColumnIndexes[csvCol] = csvHeaders.indexOf(csvCol); }); // 把CSV数据转为ID为键的对象,方便快速匹配 const csvDataMap = {}; csvRows.slice(1).forEach(row => { const id = row[csvIdIndex]?.trim(); if (!id) return; csvDataMap[id] = row; }); // 读取目标Sheet数据 const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TARGET_SHEET_NAME); const sheetData = targetSheet.getDataRange().getValues(); const sheetHeaders = sheetData[0].map(h => h.trim()); const sheetIdIndex = sheetHeaders.indexOf(SHEET_ID_COLUMN_NAME); const sheetColumnIndexes = {}; Object.values(COLUMN_MAPPING).forEach(sheetCol => { sheetColumnIndexes[sheetCol] = sheetHeaders.indexOf(sheetCol); }); // 匹配ID并填充数据 const updatedData = sheetData.map((row, rowIndex) => { if (rowIndex === 0) return row; // 跳过表头 const id = row[sheetIdIndex]?.trim(); if (!id || !csvDataMap[id]) return row; Object.entries(COLUMN_MAPPING).forEach(([csvCol, sheetCol]) => { const csvVal = csvDataMap[id][csvColumnIndexes[csvCol]]; row[sheetColumnIndexes[sheetCol]] = csvVal; }); return row; }); // 把更新后的数据写回Sheet targetSheet.getRange(1, 1, updatedData.length, updatedData[0].length).setValues(updatedData); }
使用说明
- 所有配置项都要按照你实际的文件和表结构修改,列名要完全匹配,大小写、空格都会影响识别
- 第一次运行时会提示授权,按照提示点击允许即可
- 如果CSV用的不是逗号分隔,可以在
Utilities.parseCsv的第二个参数指定分隔符,比如Utilities.parseCsv(csvContent, '\t')就是用制表符分隔 - 如果ID列存在重复值,脚本会默认用CSV里最后一个出现的同ID行数据填充
内容的提问来源于stack exchange,提问作者Maksym Katsovets
相关产品推荐
相关产品推荐

