[英]Formatting Issues with CSV import to Google Sheets from Gmail
我目前正在使用以下腳本自動從 gmail 電子郵件中導入 CSV 數據:
function importsearchresultsCSVFromGmail2() {
var threads = GmailApp.search("Scheduled report (********** **** *******)");
var messages = threads[0].getMessages();
var message = messages[messages.length - 1];
var attachment = message.getAttachments()[0];
// Is the attachment a CSV file
attachment.setContentType('text/csv');
//attachment.setContentTypeFromExtension();
if (attachment.getContentType() === "text/csv") {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var sh0 = sheet.getSheetByName("Sheet1")
var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");
// Remember to clear the content of the sheet before importing new data
sh0.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
GmailApp.markMessageRead(message);
}
}
但是,csv 中的某些地址字段在 csv 的整個單元格中被格式化為:
有些將顯示為“123 New Road, London, NE3 1RD”。 < 這些在導入中正確顯示,但是上面的格式化版本分布在多個單元格中,並且弄亂了 csv 的原始布局。
有沒有辦法確保導入的單元格(包含格式化的地址單元格)不會擴散到其他單元格?
提前致謝。
湯姆
這是一個變體(不像 Yuri 解決方案那么優雅)
function importCSVFromGoogleDrive() {
var file = DriveApp.getFilesByName("CSV TEST.csv").next();
var csvString = file.getBlob().getDataAsString().replace(/\n/g, '♥').replace(/\r♥/g, '\r\n')
var csvData = Utilities.parseCsv(csvString);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('mySheet');
sheet.clear();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
SpreadsheetApp.flush()
let ranges = SpreadsheetApp.getActive()
.createTextFinder("♥")
.matchEntireCell(false)
.matchCase(true)
.matchFormulaText(false)
.ignoreDiacritics(true)
.findAll();
ranges.forEach(function (range) {
range.setValue(range.getValue().replace(/♥/g,"\n"));
});
}
適應你的情況
var csvData = Utilities.parseCsv(attachment.getDataAsString().replace(/\n/g, '♥').replace(/\r♥/g, '\r\n'), ",");
sh0.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
SpreadsheetApp.flush()
let ranges = sh0
.createTextFinder("♥")
.matchEntireCell(false)
.matchCase(true)
.matchFormulaText(false)
.ignoreDiacritics(true)
.findAll();
ranges.forEach(function (range) {
range.setValue(range.getValue().replace(/♥/g, "\n"));
});
如果您將 CSV 顯示為文本會更好。
我認為引號內有\r
和\n
"
如果您更改此行,您可以嘗試用空格替換它們:
var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");
對此:
var s = attachment.getDataAsString().replace(/"[^"]+?"/, x => x.replace(/[\r\n]+/g, ' '));
var csvData = Utilities.parseCsv(s, ',');
Output:
更新
這是大約相同的 function 的變體。 它做同樣的事情:替換引號內的\r
和\n
。 但它用特殊符號替換它們。 並在數據粘貼到工作表后將此符號替換回\n
:
function get_csv() {
var threads = GmailApp.search("Scheduled report"); // subject
var message = threads[0].getMessages().pop(); // get last message from first thread
var attachment = message.getAttachments()[0]; // first attachment
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Sheet1");
// get the csv string and replace \n with the symbol ¶
var s = attachment.getDataAsString().replace(/"[^"]+?"/g, x => x.replace(/[\r\n]+/g, '¶'));
var csvData = Utilities.parseCsv(s, ',');
sh.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
sh.getDataRange().createTextFinder('¶').replaceAllWith('\n'); // restore \n inside cells
GmailApp.markMessageRead(message);
}
結果:
這是CSV數據(不確定復制粘貼后\r\n
是否完好):
Activity date & time,Status change,Postcode,Introducer,Marketing source,Assigned user,Lead reference,Lead date,Signed Date,Offered Date,Completed Date,Title,First name,Last name,Lead type,Lead group,Site,Product,"Security Address, if different from above"
01/02/2022,Signed,NE3 1RD,Me,,Me,172312026,15/11/2021,None,None,None,Mr.,John,Smith,Band A,Type 1,Leads.com,Fixed 5,"123 New Road, LONDON, NE3 1RD"
01/02/2022,Signed,NE3 1RD,Me,,Me,172312026,15/11/2021,None,None,None,Mr.,John,Smith,Band A,Type 1,Leads.com,Fixed 5,"123 New Road
LONDON
NE3 1RD"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.