导入 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 新菜单项“更新”时,我得到了两个意想不到的结果:
- “不正确的范围宽度,是 10 但应该是 5”
- 有两行填充了我不认识的符号。预期的结果是 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');
}
我正在尝试回收几个月前使用过的应用程序脚本,但 运行 遇到了问题。
在有问题的驱动器目录中有两个文件: 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 新菜单项“更新”时,我得到了两个意想不到的结果:
- “不正确的范围宽度,是 10 但应该是 5”
- 有两行填充了我不认识的符号。预期的结果是 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');
}