Google apps script 将CSV转换为Google电子表格并删除旧电子表格

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

我有一个功能强大的脚本,可以抓取Gmail中的所有CSV附件,并将它们放在Google Drive上的一个文件夹中。然后删除旧文件

这是必需的,因为我每天都有计划的报告通过电子邮件发送给我。必须移除旧的CSV

现在我需要将CSV文件转换为Google电子表格,而不需要创建多个同名文件

我使用驱动器API复制参数为{convert:true}的文件。这将只是每次创建一个重复的电子表格,这是我不想要的。我已删除此代码。以下是仅移动CSV文件并删除旧CSV文件的运行脚本:

// 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)