【问题标题】:How do I append data from a CSV file without the header into Google Sheet如何将不带标题的 CSV 文件中的数据附加到 Google 表格中
【发布时间】:2020-08-30 16:13:41
【问题描述】:

我已设法检索数据并将其附加到我的工作表中,但我还没有弄清楚如何排除标题行。

function importFromCSV() {
  var fileName = Browser.inputBox("Ingrese archivo en Drive a importar (ej. datosBaby.csv):");
   
  var searchTerm = "title = '"+fileName+"'";
   
  // search for our file
  var files = DriveApp.searchFiles(searchTerm)
  var csvFile = "";
   
  // Loop through the results
  while (files.hasNext()) {
    var file = files.next();
    // assuming the first file we find is the one we want
    if (file.getName() == fileName) {
      // get file as a string
      csvFile = file.getBlob().getDataAsString();
      break;
    }
  }
  // parseCsv returns a [][] array and writes to the sheet
  var csvData = Utilities.parseCsv(csvFile);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  
  // data to a sheet
  sheet.getRange(sheet.getLastRow()+1, 1, csvData.length, csvData.length).setValues(csvData);
  
  //sheet.getRange(1, 1, csvData.length, csvData[1].length).setValues(csvData); <-- This one places txt a A1
  //sheet.appendRow(csvData[1]); <-- This one  does not work
}

以下是正在发生的事情的示例: The header from the CSV import is repeated

感谢任何可以为我指明正确方向的人。我是这方面的初学者。

【问题讨论】:

标签: javascript arrays google-apps-script javascript-objects csv-import


【解决方案1】:

所以我知道您正在导入多个 csv,其中每个标题都在重复。

要摆脱它有很多动作,我自己更喜欢将实际数据的标题分开。您可以通过在数组中调用 .shift() 来做到这一点,这将删除并返回数组的第一个值。

解析csv后调用shift方法

var csvData = Utilities.parseCsv(csvFile);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

var header = csvData.shift(); // Now the csvData don't have the header and you can
                              // still use the `header` variable if needed

// data to a sheet
sheet.getRange(sheet.getLastRow()+1, 1, csvData.length, csvData[0].length)
     .setValues(csvData);

我还改变了你选择列的方式,除非你的数据是 N 个元素的 N 个方阵,否则你会遇到问题。所以最好将列作为csvData[0].length

【讨论】:

  • 非常感谢。我仍然不明白创建“var header = csvData.shift()”是如何从正在解析到活动工作表中的数据中删除标题的。 'sheet.getRange(sheet.getLastRow()+1, 1, csvData.length, csvData[0].length).setValues(csvData);' 中没有提到变量 header。但它效果很好!!!还有一个问题:如果标题是 5 行而不仅仅是第一行,我将如何转换?
  • 对数组调用的shift方法删除返回它的first元素,所以在调用之后有不再是标题。如果你想对 last 做同样的事情,可以使用 pop 方法。现在,如果您想在任意索引中执行此操作,您可以使用 splice 想象第 5 行 csvData.splice(4, 1) 含义:删除索引 4 处的 1 元素(第 5 位,因为数组是零索引)。
  • 你很有帮助。 'csvData.splice()' 效果很好,但不是 'csvData.splice(4, 1)' 而是 'csvData.splice(0, 5)'。我仍然不明白“var header”在哪里被调用。 'sheet.getRange(sheet.getLastRow()+1, 1, csvData.length, csvData[0].length).setValues(csvData);' 中未提及变量标头。
  • 很高兴它有帮助,但考虑到 csvData.splice(0, 5) 实际上会删除前 5 行,所以请看看它可能会起作用,因为你丢失了一些数据,因为我没有非常了解您的数据是如何布局的。
【解决方案2】:

拼接方法是对的,但是在上面的解决方案中,它返回了标头的值,并没有删除标头。删除表头需要的是使用 splice 函数并告诉它从第二行开始,一直到最后。这看起来像这样:

var csvDataNoHeader = csvData.splice(1,csvData.length-1)

这告诉函数从数组的第二个元素开始并选择之后的所有元素,负1表示删除标题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多