You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:14:51