Google Apps Script Utilities.parseCsv() 和替换字符 - ?

Jes*_*ack 4 csv google-sheets google-apps-script

我正在从事一个项目,该项目涉及 Google Drive 中的 csv 文件,该文件每分钟左右更新一次新数据。

我构建了一个电子表格仪表板,以使 csv 中的数据更有意义。

我错误地假设我可以使用 Google 电子表格函数 =importdata(url) 将数据从 Google Drive 中的 CSV 获取到我的 Google 电子表格中,但是,除非我公开 CSV,否则会产生错误,这不是出于安全和隐私原因是可行的。即使我确实公开了 CSV 并使用了 importdata,输入的数据也完全格式错误且无法使用 - 它看起来与实际的 CSV 完全不同。

带有 importdats(url) 的格式错误的数据

我正在尝试编写一个脚本来自动导入 csv 数据,使用 DriveApp 打开 csv 文件,Utilities.parseCsv 将 csv 转换为数据数组,然后 setValues 将数据写入工作表。

function importData() {
  var ss = SpreadsheetApp.getActive();
  var file = DriveApp.getFilesByName("Agent Performance.csv")
  var csv = file.next().getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var sheet = ss.getSheetByName('CSV Import TEST');
  for (var i = 0; i < csvData.length; i++) {
    sheet.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是我得到了替换字符,例如:?所有写入工作表的数据。这太奇怪了。工作表看起来很正常,但是如果您单击一个单元格以查看它的值,则公式栏具有单元格中的任何文本,但每个字符之间是一个 ?。这使得 Google Sheets 中的任何计算都无法进行。

注意公式栏中的替换字符

如果我只是使用 Google 表格“文件”和“导入”和“替换当前工作表”导入相同的 CSV,那么数据就可以了。这不是一个好的解决方案,因为我真的希望 CSV 更新和 Google 表格中的仪表板更新之间的延迟不超过几分钟。如果我必须手动上传 CSV,它就违背了系统的目的。

任何帮助将不胜感激。谢谢!

Hen*_*reu 5

你检查过文件字符集吗?您可以在调用时指定它getDataAsString(charset)。尝试这个:

function importData() {
  var ss = SpreadsheetApp.getActive();
  var file = DriveApp.getFilesByName("Agent Performance.csv")
  var csv = file.next().getBlob().getDataAsString('ISO-8859-1'); //note the charset
  var csvData = Utilities.parseCsv(csv);
  //unless you csv has variable amount of columns per line, you should do this
  if(csvData.length > 0) {
    ss.getSheetByName('CSV Import TEST')
      .getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
  } else
    throw 'Blank file';
}
Run Code Online (Sandbox Code Playgroud)