Преобразование CSV в таблицу Google и удаление старой таблицы - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть работающий скрипт, который захватывает все CSV-вложения в Gmail и помещает их в папку на Google Диске.Затем он удаляет старый файл.

Это необходимо, потому что у меня есть запланированные отчеты по электронной почте мне каждый день.Старые CSV-файлы должны быть удалены.

Теперь мне нужно преобразовать CSV-файл в электронную таблицу Google, не создавая несколько файлов с одинаковым именем.

Я использовал Drive 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;
}

1 Ответ

0 голосов
/ 23 сентября 2019

Вместо того, чтобы пытаться сохранить 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...