【问题标题】:Apps Script Google Drive CSV ImportApps 脚本 Google Drive CSV 导入
【发布时间】:2021-08-06 02:34:39
【问题描述】:

我尝试使用脚本从驱动器导入 csv。 如果只有一个“,”作为分隔符,我发现的每个解决方案都可以正常工作。

就我而言,我有两个分隔符,我无法替换文本分隔符。 导入文本分隔符似乎有问题。 如何解决这个问题?

id;name;colorGroup;isOnline;publishedAt;material;washing;care;description;additionalDescriptions;offlineOnly;createdAt;updatedAt;modifiedFromCalaogueAt;imageMtime;manufacturerProductId;marketingColor;stock;stockTotal
101000000021;"501 Original Fit Jeans";dunkelblau;1;"2014-05-06 10:27";"100% Baumwolle ";;"Maschinenwäsche bei 30 Grad,Nicht bleichen,Trockenreinigung Kein Trichlorethylen,Trockner bei normaler Temperatur,Heiß bügeln";;"Reguläre Passform mit gerader Beinöffnung,Normale Leibhöhe,Hoher Tragekomfort durch Stretch-Denim,Abriebstellen an den Taschen- und Abschlusskanten,Mit einer Knopfleiste zu verschließen,Bei einer Größe von 1.87 m trägt unser Model Gr. 31/32";;"2015-07-07 11:21";"2021-08-05 14:23";"2021-08-05 02:50";"2015-11-16 11:49";0050101;01;"29/30->0, 29/32->0, 29/34->0, 30/30->3, 30/32->1, 30/34->1, 31/30->1, 31/32->1, 31/34->1, 32/30->0, 32/32->1, 32/34->2, 33/30->1, 33/32->2, 33/34->2, 34/30->0, 34/32->1, 34/34->2";19

这是脚本。

function importCSVFromGoogleDrive() {

  var file = DriveApp.getFilesByName("productsAll.csv").next();
  var csvString = file.getBlob().getDataAsString()
  csvString = csvString.replace(/;/g, ",")
  csvString = csvString.replace(/"/g, "")
  //Logger.log(csvString);
  //csvString = csvString.replace(/\|/g, ".")
  var csvData = Utilities.parseCsv(csvString);
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test');
  sheet.clear();
  sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

}

最好的问候 安迪

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    parseCsv(csv, delimiter)

    function importCSVFromGoogleDrive() {
    
      var file = DriveApp.getFilesByName("productsAll.csv").next();
      var csvString = file.getBlob().getDataAsString()
      var csvData = Utilities.parseCsv(csvString, ';');
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test');
      sheet.clear();
      sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
    
    }
    

    【讨论】:

    • 对此感到抱歉 - 这只是为了尝试我是否可以在没有文本分隔符的情况下处理它。但是,如果我尝试使用文本分隔符导入文件,它就不起作用。例外:无法解析文本。
    • 已更新。是你要找的吗?我不能很好地理解你的问题。
    【解决方案2】:

    可能这不是一个通用的解决方案,但对于这种情况,我会考虑制作自己的 CSV 解析器(实际上只是一行):

    function make_table() {
      var str = `id;name;colorGroup;isOnline;publishedAt;material;washing;care;description;additionalDescriptions;offlineOnly;createdAt;updatedAt;modifiedFromCalaogueAt;imageMtime;manufacturerProductId;marketingColor;stock;stockTotal
    101000000021;"501 Original Fit Jeans";dunkelblau;1;"2014-05-06 10:27";"100% Baumwolle ";;"Maschinenwäsche bei 30 Grad,Nicht bleichen,Trockenreinigung Kein Trichlorethylen,Trockner bei normaler Temperatur,Heiß bügeln";;"Reguläre Passform mit gerader Beinöffnung,Normale Leibhöhe,Hoher Tragekomfort durch Stretch-Denim,Abriebstellen an den Taschen- und Abschlusskanten,Mit einer Knopfleiste zu verschließen,Bei einer Größe von 1.87 m trägt unser Model Gr. 31/32";;"2015-07-07 11:21";"2021-08-05 14:23";"2021-08-05 02:50";"2015-11-16 11:49";0050101;01;"29/30->0, 29/32->0, 29/34->0, 30/30->3, 30/32->1, 30/34->1, 31/30->1, 31/32->1, 31/34->1, 32/30->0, 32/32->1, 32/34->2, 33/30->1, 33/32->2, 33/34->2, 34/30->0, 34/32->1, 34/34->2";19`
    
      var csvData = str.split('\n').map(x => x.split(';').map(y => y.replace(/"(.+?)"/, '$1')));
    
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test');
    
      sheet.getRange(1,1,csvData.length,csvData[0].length).setValues(csvData);
    }
    

    输出:

    但我看不出你的输出应该是什么样子。据我所知,您的 CSV 有一个分隔符 ;

    R 列看起来很奇怪。我不知道这是正确的结果还是您打算用逗号分隔它?

    更新

    在以这种方式解析字符串之前,您可以将单元格内的\n 替换为任何符号:

    // replace '\n' inside quotes with symbol
    var symbol = '¶';
    var m = str.match(/"[^";]*?\n[^"]*?"/g);
    if (m) m.forEach(t=>str=str.split(t).join(t.replace(/\n/g,symbol)));
    

    在表格中会是这样的:

    symbol 可以是除 \n;, 之外的任何值。

    您可以将symbol 替换回\n, 或将数据放置在工作表上之后的任何内容。我更喜欢这样做:

    var another_symbol = '\n'
    sheet.getDataRange().createTextFinder(symbol).replaceAllWith(another_symbol);
    

    但实际上最好避免在单元格内使用\n

    【讨论】:

    • 你好尤里。谢谢,但 csv 有超过 50000 行,所以脚本运行超时。 :(
    • 悲伤的一天。尽管如此,我还是在我的 RegExp (str.match...) 中发现了一个错误并修复了它。以防万一。数据量是另一回事。可能您需要找到部分获取数据的方法。
    【解决方案3】:

    谢谢尤里。

    这看起来很完美。 我唯一的问题是,有时一列内也会有一个新行。 你知道如何处理这个问题吗?

    例如这三行:

    101000009852;Luke;dunkelblau;1;;"99% Baumwolle 1% Elasthan";"Stone washed";"Maschinenwäsche bei 30 Grad,Nicht bleichen,Trockenreinigung Kein Trichlorethylen,Trockner bei reduzierter Temperatur,Nicht heiß bügeln";;"Mittlere Leibhöhe,Knopfverschluss,Reißverschluss,Aufgesetzte Taschen,Metallknöpfe,Farbige Naht,Lederpatches,Ziernaht-Gesäßtaschen";;"1970-01-01 01:33";"2021-08-05 14:23";"2021-08-05 12:53";"2015-11-16 12:07";L719;DXYX;"27/32->0, 28/32->0, 29/32->0, 30/30->0, 30/32->0, 30/34->0, 31/30->0, 31/32->0, 31/34->0, 32/30->0, 32/32->0, 32/34->0, 32/36->0, 33/30->0, 33/32->0, 33/34->0, 33/36->0, 34/30->0, 34/32->0, 34/34->0, 34/36->0, 36/32->0, 36/34->0";0
    107000012934;Longsleeve;rot;;"2015-01-14 10:46";"100% Baumwolle ";;"Keine Chemische Reinigung,Maschinenwäsche bei 30 Grad,Nicht bleichen,Nicht in den Trockner,Mäßig heiß bügeln";;"Longsleeve mit seitlichen Schlitzen am Saum,Leicht Verlängerte Rückenpartie";;"1970-01-01 01:33";"2021-08-05 14:23";"2021-08-05 03:13";"2015-11-16 12:13";VICTIM;DustyRed;"L->0, M->0, S->0, XL->0";0
    113000003095;Sneaker;beige;1;"2017-10-13 03:05";;;;Größentabelle:;"Kombination aus Mesh und Wildleder,Gummisohle
    ;;"2015-07-07 11:57";"2021-08-05 14:23";"2021-08-05 03:07";"2015-11-16 12:18";CM1600GR;GreyGreen;11,5->0;0
    

    正如您在“Gummisohle”之后的最后一行中看到的那样

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多