Google Sheet邮件附件CSV导入脚本首行数据丢失问题求助
问题描述
我用以下脚本将邮件附件中的CSV文件导入Google Sheet,但协作方提供的CSV首行数据无法被脚本获取。手动在Google Sheet中打开该CSV并重新下载后再发送给自己,首行数据就能正常导入,由此判断问题出在原始CSV文件本身,而非脚本。
使用的脚本
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*---------------------------------------工作表名称---------------------------------------------------------*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const paper_1 = "CSV brute" const paper_2 = "paramètre" const paper_3 = "BDD - Historique Valeur" const paper_ID = "CSV ID" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*---------------------------------------搜索CSV邮件-----------------------------------------------------*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*搜索指定标签下主题匹配的邮件: - label:rondes-poitiers---csv// HUGO的标签 - label:rapports-de-ronde-domms// YAHYA的标签*/ var requete ="{label:rapports-de-ronde-domms}"; function PROJET_pluto_test() { var threads = GmailApp.search(requete); //遍历最近5封邮件,避免遗漏(每15分钟会收到新邮件) var object_mail = SpreadsheetApp.getActive().getSheetByName("Feuille 123").getRange("N3").getValue() for(var n=0;n<=5;n++) { var message = threads[n].getMessages()[0]; Logger.log(object_mail + " = " + message.getSubject()) if (message.getSubject() == object_mail) { //在Google Sheet弹出提示 SpreadsheetApp.getActive().toast("📱➡📁 正在查找来自平板的数据。"); var attachment = message.getAttachments()[0]; attachment.setContentTypeFromExtension(); var ss = SpreadsheetApp.getActive(); //指定数据导入的目标工作表 var sh = ss.getSheetByName(paper_1); //读取附件数据为字符串 var dataString = attachment.getDataAsString(); //格式化CSV数据 var csvData = CSVToArray(dataString); //清空目标工作表的内容和格式 sh.clear({ formatOnly: true, contentsOnly: true }); //将格式化后的数据写入工作表 var lastRowValue = sh.getLastRow(); for (var i = 0; i < csvData.length; i++) { sh.getRange(i+lastRowValue+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i])); Logger.log("🔴" +new Array(csvData[i])) } } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------数据格式化处理-----------------------------------------------------*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 格式化CSV数据,确保正确写入Google Sheet function CSVToArray( strData, strDelimiter ){ strDelimiter = (strDelimiter || ","); var objPattern = new RegExp( ( // 匹配分隔符 "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" + // 匹配带引号的字段 "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + // 匹配标准字段 "([^\"\\" + strDelimiter + "\\r\\n]*))" ), "gi" ); // 存储解析后的数据 var arrData = [[]]; var arrMatches = null; while (arrMatches = objPattern.exec( strData )){ Logger.log(strData) // 获取匹配到的分隔符 var strMatchedDelimiter = arrMatches[ 1 ]; if (strMatchedDelimiter.length && strMatchedDelimiter != strDelimiter){ arrData.push( [] ); } // 处理带引号的字段(转义内部双引号) if (arrMatches[ 2 ]){ var strMatchedValue = arrMatches[ 2 ].replace(new RegExp( "\"\"", "g" ), "\""); } else { var strMatchedValue = arrMatches[ 3 ]; } arrData[ arrData.length - 1 ].push( strMatchedValue ); } return( arrData ); }
内容的提问来源于stack exchange,提问作者Romain Gapteau
相关产品推荐
相关产品推荐

