导入 csv 文件的脚本给出了有趣的字符,包括黑色菱形中的问号

Script to import csv file gives funny characters including question marks in a black diamond

我正在尝试回收几个月前使用过的应用程序脚本,但 运行 遇到了问题。

在有问题的驱动器目录中有两个文件: leads_data.csv; LeadsReport (Google Sheet).

我的目标是使用脚本将数据从 csv 文件导入 LeadsReport。

csv 文件在文本编辑器中的样子如下:

所以数据似乎是用逗号分隔的。

这是我的应用程序脚本:

// add the CSV menu. Might change this to be an automatic update base don date
function onOpen() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
  var csvMenuEntries = [{name: "Update Data", functionName: "importFromCSV"}];
  ss.addMenu("Update", csvMenuEntries);
}

function importFromCSV() {
      var file = DriveApp.getFilesByName("leads_data.csv");// get the file object
      var csvFile = file.next().getBlob().getDataAsString();// get string content
      Logger.log(csvFile);// check in the logger
      var csvData = CSVToArray_(csvFile);// convert to 2D array
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('DataImport'); // only add data to the tab DataImport to prevent overwriting other parts of the spreadsheet
      sheet.getRange(2,1, csvData.length, csvData[0].length).setValues(csvData);// write to sheet in one single step. Start at row 2 (getRange(2... )
      SpreadsheetApp.getUi().alert('Data Updated');
    }

    function CSVToArray_(strData){
     var rows = strData.split("\r");
  // Logger.log(rows.length);
     var array = [];
      for(n=0;n<rows.length;++n){
       if(rows[n].split(',').length>1){
         array.push(rows[n].split(','));
       }
       }
    Logger.log(array);
    return array;
      
    }

当我保存然后 select 新菜单项“更新”时,我得到了两个意想不到的结果:

  1. “不正确的范围宽度,是 10 但应该是 5”
  2. 有两行填充了我不认识的符号。预期的结果是 table 的数据有 7 列和大约 3,000 行。见下图。

根据以前的经验,我尝试在以下之间进行更改:

var rows = strData.split("\r");
var rows = strData.split("\n");

在每种情况下我都得到了相似的结果。

谁能看出为什么我的脚本以这种方式导入数据?

使用内置的 csv 解析器。看看下面的片段。

https://developers.google.com/apps-script/reference/utilities/utilities#parseCsv(String)

function myFunction() {
  var file = DriveApp.getFilesByName('CCStandards - English Language Arts & Literacy.csv').next();
  Logger.log(Utilities.parseCsv(file.getBlob().getDataAsString()));
}

// 您的代码改编如下

function importFromCSV() {
  var file = DriveApp.getFilesByName("leads_data.csv");// get the file object
  var csvFile = file.next().getBlob().getDataAsString();// get string content
  var csvData = Utilities.parseCsv(csvFile);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DataImport'); // only add data to the tab DataImport to prevent overwriting other parts of the spreadsheet
  sheet.getRange(2,1, csvData.length, csvData[0].length).setValues(csvData);// write to sheet in one single step. Start at row 2 (getRange(2... )
  SpreadsheetApp.getUi().alert('Data Updated');
}