Google Apps Script表头映射函数输出不符预期,求解决方法
问题排查与修复
核心问题分析
- 大小写匹配错误:代码中把原始表头转成小写(
header.toLowerCase())去匹配headerMapping的键,但headerMapping的键是原始大小写格式(比如'Campaign Id'),导致大部分表头无法匹配到映射值,直接返回原表头。 - 映射键缺失:原始表头中的
Spend在headerMapping里没有对应规则,只有Cost的映射,所以无法转换为预期的cost_column。
修复后的完整代码
function headerMapping() { var values = [['Campaign Id', 'Source', 'Medium', 'Campaign', 'Date', 'Spend', 'Clicks', 'Impressions'], ['563573', 'bing', 'cpc', 'Search', 'Sun Jun 25 00:00:00 GMT+01:00 2023', '18.97', '7.0', '11.0']]; var originalHeaders = ['Campaign Id', 'Source', 'Medium', 'Campaign', 'Date', 'Spend', 'Clicks', 'Impressions']; var headerMapping = { 'Campaign Id': 'campaign_id', 'Source': 'campaign_source', 'Medium': 'campaign_medium', 'Campaign': 'campaign_name', 'Date': 'date_column', 'Cost': 'cost_column', 'Spend': 'cost_column', // 新增Spend的映射规则 'Clicks': 'clicks_column', 'Impressions': 'impressions_column' }; // 修正映射逻辑:直接用原始表头字符串匹配,取消转小写操作 var newHeaders = originalHeaders.map(function(header) { return headerMapping[header] || header; }); var csvData = [newHeaders.join(',')]; for (var i = 1; i < values.length; i++) { var row = values[i]; var formattedRow = []; for (var j = 0; j < row.length; j++) { var value = row[j]; // 修复日期处理的两个问题:变量未定义+字符串转Date对象 if (originalHeaders[j] === 'Date' && typeof value === 'string') { var dateObj = new Date(value); value = Utilities.formatDate(dateObj, Session.getTimeZone(), 'YYYY-MM-dd'); } formattedRow.push(value); } csvData.push(formattedRow.join(',')); } Logger.log(csvData.join('\n')); }
关键修复点说明
- 补充映射规则:在
headerMapping中添加'Spend': 'cost_column',让原始表头的Spend能映射到预期值。 - 修正匹配逻辑:去掉
header.toLowerCase(),直接使用原始表头字符串匹配映射键,确保大小写一致能匹配成功。 - 修复日期处理:原代码中
spreadsheet变量未定义,改用Session.getTimeZone();同时测试数据中的日期是字符串,需要先转换为Date对象再格式化。
修复后输出表头
campaign_id,campaign_source,campaign_medium,campaign_name,date_column,cost_column,clicks_column,impressions_column
内容的提问来源于stack exchange,提问作者heritaki
相关产品推荐
相关产品推荐

