【问题标题】:How to Import tab-delimited "CSV"如何导入制表符分隔的“CSV”
【发布时间】:2014-08-31 23:25:53
【问题描述】:

与您的文档列表交互教程中,Importing data from a CSV file 展示了如何使用逗号分隔值导入 CSV 文件。

不过,我将上传一个带有制表符分隔值的.txt 文件。 (例如可以从 Excel 导出。)

如何修改该脚本以将导入的电子表格识别为制表符分隔值而不是逗号分隔值?

【问题讨论】:

    标签: javascript csv import google-apps-script google-sheets


    【解决方案1】:

    使用Utilities.parseCsv(csv, delimiter)。以下内容改编自 Google Apps 脚本教程Interacting With Your Docs List,将CSVToArray() 替换为Utilities.parseCsv()

    要自动检测分隔符是制表符还是逗号很简单:

    // Detect delimiter - tab or comma
    var delim = ",";
    if (csvFile.indexOf("\t") != -1) delim = "\t"; 
    

    importFromCSV

    /**
     * Populates a sheet with contents read from a CSV file located
     * in the user's GDrive. If either parameter is not provided, the
     * function will open inputBoxes to obtain them interactively.
     *
     * Adapted from <I>Tutorial: Interacting With Your Docs List.</I>
     (https://developers.google.com/apps-script/articles/docslist_tutorial#section2)
     *
     * @param {string}fileName (Optional) The name of the input file.
     *
     * @param {string} sheetName (Optional) The name of the destination sheet.
     *        If the sheet does not exist, it will be created by
     *        this function. A pre-existing sheet will be cleared 
     *        before importing the CSV data.
     *
     * @returns {JsonObject} A summary of the import operation,
     *        including the date the input file was last updated
     *        [see <a href="https://developers.google.com/apps-script/class_file#getLastUpdated">File.getLastUpdated()</a>], and the number of rows
     *        and columns imported.
     * <PRE>
     *
     *   { lastUpdated : 5-Mar-2014, numRows : 2541, numCols : 22 }
     *  </PRE>
     *
     *  @throws {Error} "No Input File" if input CSV not found.
     */
    function importFromCSV(fileName,sheetName) {
      var useBrowser = (!fileName);   // Assume that spreadsheet UI in use, if no args
      fileName = fileName || Browser.inputBox("Enter the name of the file in your Docs List to import (e.g. myFile.csv):");
      sheetName = sheetName || Browser.inputBox("Enter the name of the sheet to import into (e.g. Sheet1):");
    
      var files = DocsList.getFiles();
      var csvFile = "";
      var lastUpdated = 0;
    
      for (var i = 0; i < files.length; i++) {
        if (files[i].getName() == fileName) {
          csvFile = files[i].getContentAsString();
          lastUpdated = files[i].getLastUpdated();
          break;
        }
      }
    
      if (lastUpdated == 0) {
        Browser.msgBox("No Input File", "Either no file name was provided, or file does not exist.", Browser.Buttons.OK);
        throw new Error("No Input File");
      }
      else {
        // Detect delimiter - tab or comma
        var delim = ",";
        if (csvFile.indexOf("\t") != -1) delim = "\t"; 
    
        var csvData = Utilities.parseCsv(csvFile, delim);
    
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = ss.getSheetByName(sheetName);
        if (sheet === null) {
          ss.insertSheet(sheetName);
          sheet = ss.getSheetByName(sheetName);
        }
    
        sheet.clear();
    
        var numRows = csvData.length;
        var numCols = csvData[0].length; // assume all rows are same width
    
        // Make a single call to spreadsheet API to write values to sheet.
        sheet.getRange(1, 1, numRows, numCols).setValues( csvData );
    
      }
    
      // Report results (if UI attached)  
      Browser.msgBox("Imported " + numRows + " rows x " + numCols + "columns");
    
      // Return an object with import results
      return { lastUpdated : lastUpdated, numRows : numRows, numCols : numCols };
    }
    

    电子表格菜单项

    创建自定义菜单前端:

    function onOpen() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var cMenuEntries = [{name: "Load CSV Data", functionName: "importFromCSV"}];
      ss.addMenu("Custom", cMenuEntries);
    }
    

    带参数调用

    您还可以从其他脚本调用该函数,为 csv 文件名和电子表格选项卡传递参数。

    function test_importFromCSV() {
      return importFromCSV("My CSV File.txt","Sheet1");
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 2012-08-04
      • 2015-12-06
      • 2013-10-15
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2013-05-22
      相关资源
      最近更新 更多