Google apps script 将CSV转换为Google电子表格并删除旧电子表格
我有一个功能强大的脚本,可以抓取Gmail中的所有CSV附件,并将它们放在Google Drive上的一个文件夹中。然后删除旧文件 这是必需的,因为我每天都有计划的报告通过电子邮件发送给我。必须移除旧的CSV 现在我需要将CSV文件转换为Google电子表格,而不需要创建多个同名文件 我使用驱动器API复制参数为{convert:true}的文件。这将只是每次创建一个重复的电子表格,这是我不想要的。我已删除此代码。以下是仅移动CSV文件并删除旧CSV文件的运行脚本:Google apps script 将CSV转换为Google电子表格并删除旧电子表格,google-apps-script,Google Apps Script,我有一个功能强大的脚本,可以抓取Gmail中的所有CSV附件,并将它们放在Google Drive上的一个文件夹中。然后删除旧文件 这是必需的,因为我每天都有计划的报告通过电子邮件发送给我。必须移除旧的CSV 现在我需要将CSV文件转换为Google电子表格,而不需要创建多个同名文件 我使用驱动器API复制参数为{convert:true}的文件。这将只是每次创建一个重复的电子表格,这是我不想要的。我已删除此代码。以下是仅移动CSV文件并删除旧CSV文件的运行脚本: // GLOBALS //A
// GLOBALS
//Array of file extension which you would like to extract to Drive
var fileTypesToExtract = ['csv'];
//Name of the folder in google drive i which files will be put
var folderName = 'GmailToDrive';
//Name of the label which will be applied after processing the mail message
var labelName = 'GmailToDrive';
function GmailToDrive(){
//build query to search emails
var query = '';
//filename:jpg OR filename:tif OR filename:gif OR fileName:png OR filename:bmp OR filename:svg'; //'after:'+formattedDate+
for(var i in fileTypesToExtract){
query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
}
query = 'in:inbox has:nouserlabels ' + query;
var threads = GmailApp.search(query);
var label = getGmailLabel_(labelName);
var parentFolder;
if(threads.length > 0){
parentFolder = getFolder_(folderName);
}
var root = DriveApp.getRootFolder();
for(var i in threads){
var mesgs = threads[i].getMessages();
for(var j in mesgs){
//get attachments
var attachments = mesgs[j].getAttachments();
for(var k in attachments){
var attachment = attachments[k];
var isDefinedType = checkIfDefinedType_(attachment);
if(!isDefinedType) continue;
var AttachmentTitle = attachment.getName();
var attachmentBlob = attachment.copyBlob();
var existingFile = DriveApp.getFilesByName(attachment.getName());
if (existingFile.hasNext()) {
var file = existingFile.next();
file.setTrashed(true);
}
var filetemp = DriveApp.createFile(attachmentBlob);
parentFolder.addFile(file);
root.removeFile(file);
}
}
threads[i].addLabel(label);
}
}
//This function will get the parent folder in Google drive
function getFolder_(folderName){
var folder;
var fi = DriveApp.getFoldersByName(folderName);
if(fi.hasNext()){
folder = fi.next();
}
else{
folder = DriveApp.createFolder(folderName);
}
return folder;
}
//getDate n days back
// n must be integer
function getDateNDaysBack_(n){
n = parseInt(n);
var date = new Date();
date.setDate(date.getDate() - n);
return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM/dd');
}
function getGmailLabel_(name){
var label = GmailApp.getUserLabelByName(name);
if(!label){
label = GmailApp.createLabel(name);
}
return label;
}
//this function will check for filextension type.
// and return boolean
function checkIfDefinedType_(attachment){
var fileName = attachment.getName();
var temp = fileName.split('.');
var fileExtension = temp[temp.length-1].toLowerCase();
if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
else return false;
}
您不必尝试将CSV保存在驱动器上并将其转换为Google电子表格,您可以 直接将附件中的CSV导入为此目的创建的电子表格 样本
var ss=SpreadsheetApp.create(attachment.getName());
var sheet=ss.getActiveSheet();
var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
var file=DriveApp.getFileById(ss.getId())
parentFolder.addFile(file);
root.removeFile(file);
完整代码:
function GmailToDrive(){
//build query to search emails
var query = '';
//filename:jpg OR filename:tif OR filename:gif OR fileName:png OR filename:bmp OR filename:svg'; //'after:'+formattedDate+
for(var i in fileTypesToExtract){
query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
}
query = 'in:inbox has:nouserlabels ' + query;
var threads = GmailApp.search(query);
var label = getGmailLabel_(labelName);
var parentFolder;
if(threads.length > 0){
parentFolder = getFolder_(folderName);
}
var root = DriveApp.getRootFolder();
for(var i in threads){
var mesgs = threads[i].getMessages();
for(var j in mesgs){
//get attachments
var attachments = mesgs[j].getAttachments();
for(var k in attachments){
var attachment = attachments[k];
var isDefinedType = checkIfDefinedType_(attachment);
if(!isDefinedType) continue;
var AttachmentTitle = attachment.getName();
var files = DriveApp.getFilesByName(AttachmentTitle);
while (files.hasNext()) {
var file = files.next();
Logger.log(file.getName());
file.setTrashed(true);
}
var ss=SpreadsheetApp.create(attachment.getName());
var sheet=ss.getActiveSheet();
var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
var file=DriveApp.getFileById(ss.getId())
parentFolder.addFile(file);
root.removeFile(file);
}
}
threads[i].addLabel(label);
}
}
//This function will get the parent folder in Google drive
function getFolder_(folderName){
var folder;
var fi = DriveApp.getFoldersByName(folderName);
if(fi.hasNext()){
folder = fi.next();
}
else{
folder = DriveApp.createFolder(folderName);
}
return folder;
}
//getDate n days back
// n must be integer
function getDateNDaysBack_(n){
n = parseInt(n);
var date = new Date();
date.setDate(date.getDate() - n);
return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM/dd');
}
function getGmailLabel_(name){
var label = GmailApp.getUserLabelByName(name);
if(!label){
label = GmailApp.createLabel(name);
}
return label;
}
//this function will check for filextension type.
// and return boolean
function checkIfDefinedType_(attachment){
var fileName = attachment.getName();
var temp = fileName.split('.');
var fileExtension = temp[temp.length-1].toLowerCase();
if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
else return false;
}
欢迎来到StackOverFlow,请借此机会学习如何使用和。感谢您的回复。我测试并得到以下错误:异常:参数(字符串、字符串)与Utilities.parseCsv的方法签名不匹配。所有查询的附件是否都是有效的Csv文件,Csv数据是否以逗号分隔?如果没有,您必须相应地调整分隔符-方法语法是
parseCsv(csv,delimiter)
而不是调试,我从头开始编写一个新脚本来覆盖相应的工作表。创建和删除ss不适用于data studio,因为文件ID发生更改,它会失去连接。这是一个适用于我的代码段:var mediaData=DriveApp.getFileById(例如from.getBlob().getDataAsString()代码>var csvData=Utilities.parseCsv(mediaData)代码>var ss=SpreadsheetApp.openById(e.to)代码>SpreadsheetApp.setActiveSpreadsheet(ss)代码>var sheet=SpreadsheetApp.getActiveSheet()代码>var ss=sheet.getRange(1,1,csvData.length,csvData[0].length).setValues(csvData)代码>