我是 GAS 新手,我正在努力解决我遇到的问题。 (我在网站上没有找到可以解决我的问题的类似问题,因此我提出了一个新问题)
目标:将 CSV 从 Google 云端硬盘导入 Google 表格
问题:
csv 文件中的货币为“1,000.57”--> 美国格式
我需要“1.000,57”的货币格式 --> 欧洲格式
目前,使用 Utilities.parseCsv()
时,格式会变得困惑,而且货币也完全错误。
问题:有没有办法把“,”改为“.”和 ”。”解析期间“,”?如果是这样,还会有进一步的问题吗,因为 csv 的分隔符也是“,”。
我已经在网络上找到了一些代码片段(不是我的代码:spreadsheet.dev 的 props)并尝试更改以下内容,但它似乎不起作用:
//Imports a CSV file in Google Drive into the Google Sheet
function importCSVFromDrive() {
var fileName = promptUserForInput("Please enter the name of the CSV file to import from Google Drive:");
var files = findFilesInDrive(fileName);
if(files.length === 0) {
displayToastAlert("No files with name \"" + fileName + "\" were found in Google Drive.");
return;
} else if(files.length > 1) {
displayToastAlert("Multiple files with name " + fileName +" were found. This program does not support picking the right file yet.");
return;
}
var file = files[0];
var csvString = file.getBlob().getDataAsString()
var escapedString = csvString.replace(",",".")
.replace(".",",");
var contents = Utilities.parseCsv(escapedString);
var sheetName = writeDataToSheet(contents);
displayToastAlert("The CSV file was successfully imported into " + sheetName + ".");
}
//Prompts the user for input and returns their response
function promptUserForInput(promptText) {
var ui = SpreadsheetApp.getUi();
var prompt = ui.prompt(promptText);
var response = prompt.getResponseText();
return response;
}
//Returns files in Google Drive that have a certain name.
function findFilesInDrive(filename) {
var files = DriveApp.getFilesByName(filename);
var result = [];
while(files.hasNext())
result.push(files.next());
return result;
}
//Inserts a new sheet and writes a 2D array of data in it
function writeDataToSheet(data) {
var ss = SpreadsheetApp.getActive();
sheet = ss.insertSheet();
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
return sheet.getName();
}
我做错了什么?
最佳答案
您的 CSV 数据示例如下:https://drive.google.com/file/d/1ASevYOWtu8YL6YA4w-UqDuNXAS0RfaJF/view?usp=sharing
在我看来,它就像普通的 CSV 数据:
Trades,Header,DataDiscriminator,Asset Category,Currency,Symbol,Date/Time,Quantity,T.Price
Trades,Data,Order,Stocks,USD,ALGN,"2021-06-28,10:50:27",3,627.17,621.52,-1881.51,-1,1882.51,0,-16.95,O
Trades,Data,Order,Stocks,USD,AMAT,"2021-06-29,09:38:53",14,142.15,141.92,-1990.1,-1,1991.1,0,-3.22,O
Trades,Data,Order,Stocks,USD,APH,"2021-07-02,09:30:01",30,69.438,69.95,-2083.14,-1,2084.14,0,15.36,O
我没有看到任何“欧洲”格式的数字。
我相信它可以正确解析为:
我还没有尝试过使用 Utilities.parseCsv()
来做到这一点,我编写了自己的小型 csv 解析器,只是为了确保该任务是可行的并且我的假设是正确的:
var s = `Trades,Header,DataDiscriminator,Asset Category,Currency,Symbol,Date/Time,Quantity,T.Price
Trades,Data,Order,Stocks,USD,ALGN,"2021-06-28,10:50:27",3,627.17,621.52,-1881.51,-1,1882.51,0,-16.95,O
Trades,Data,Order,Stocks,USD,AMAT,"2021-06-29,09:38:53",14,142.15,141.92,-1990.1,-1,1991.1,0,-3.22,O
Trades,Data,Order,Stocks,USD,APH,"2021-07-02,09:30:01",30,69.438,69.95,-2083.14,-1,2084.14,0,15.36,O`;
// replace ',' with '_' inside quotes
s.match(/("[^,]+),(.+")/g).forEach(t=>s=s.split(t).join(t.replace(/,/g,'_')));
// replace ',' with '\t', replace '_' with ',' and split string into 2-d array
var array = s.replace(/,/g,"\t").replace(/_/g,',').split('\n').map(x => x.split('\t'));
console.table(array);
输出:
┌─────────┬──────────┬──────────┬─────────────────────┬──────────────────┬────────────┬──────────┬─────────────────────────┬────────────┬───────────┬──────────┬────────────┬──────┬───────────┬─────┬──────────┬─────┐
│ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │
├─────────┼──────────┼──────────┼─────────────────────┼──────────────────┼────────────┼──────────┼─────────────────────────┼────────────┼───────────┼──────────┼────────────┼──────┼───────────┼─────┼──────────┼─────┤
│ 0 │ 'Trades' │ 'Header' │ 'DataDiscriminator' │ 'Asset Category' │ 'Currency' │ 'Symbol' │ 'Date/Time' │ 'Quantity' │ 'T.Price' │ │ │ │ │ │ │ │
│ 1 │ 'Trades' │ 'Data' │ 'Order' │ 'Stocks' │ 'USD' │ 'ALGN' │ '"2021-06-28,10:50:27"' │ '3' │ '627.17' │ '621.52' │ '-1881.51' │ '-1' │ '1882.51' │ '0' │ '-16.95' │ 'O' │
│ 2 │ 'Trades' │ 'Data' │ 'Order' │ 'Stocks' │ 'USD' │ 'AMAT' │ '"2021-06-29,09:38:53"' │ '14' │ '142.15' │ '141.92' │ '-1990.1' │ '-1' │ '1991.1' │ '0' │ '-3.22' │ 'O' │
│ 3 │ 'Trades' │ 'Data' │ 'Order' │ 'Stocks' │ 'USD' │ 'APH' │ '"2021-07-02,09:30:01"' │ '30' │ '69.438' │ '69.95' │ '-2083.14' │ '-1' │ '2084.14' │ '0' │ '15.36' │ 'O' │
└─────────┴──────────┴──────────┴─────────────────────┴──────────────────┴────────────┴──────────┴─────────────────────────┴────────────┴───────────┴──────────┴────────────┴──────┴───────────┴─────┴──────────┴─────┘
如果添加 range.setValues(array)
而不是console.table(array)
您可能会在工作表中得到一个合适的表格。
更新
替换123.45
--> 123,45
在数组中,您需要在末尾添加一行:
array = array.map(row => row.map(cell => cell.replace(/(\d)\.(\d)/g, '$1,$2')));
关于csv - Google Apps Script Utilities.parseCsv() 更改小数和千位分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68482496/