Как отсортировать последние четыре файла в папке на диске Google с помощью google-apps-script? - PullRequest
1 голос
/ 05 июля 2019

У меня есть несколько листов в Google Drive. Я пытаюсь отправить только последние четыре месяца файлы на диске Google на электронную почту. Проблема в том, что месяцы определены в имени файла. Так что нет отметки времени

Пока что я ищу файлы по заголовку, содержащему "Mar 2019", или заголовок содержит "Apr 2019". если это так, я должен менять код каждый месяц после добавления файла на диск Google.

function checkSales(){

  var file, files = DriveApp.getFolderById("").searchFiles('title 
  contains "Mar 2019" or title contains "Apr 2019" or title contains "May 
  2019" or title contains "Jun 2019"')
  var body = '';
  var subject = [];
  while (files.hasNext()) {
    file = files.next();
    var activeSpreadSheet = SpreadsheetApp.open(file);
    var spreadsheetName = activeSpreadSheet.getName(); // Added
      var sheets = activeSpreadSheet.getSheets();
      for (var sheetIndex = 0; sheetIndex < sheets.length; sheetIndex++) {
        var sheet = sheets[sheetIndex];
        var data = sheet.getDataRange().getValues();
        var resultArr = [];
        for (var i=1;i<data.length;i++) {
          for (var j=11;j<19;j++) {
            var cellVal = data[i][j];
            if (cellVal > 0) {
              resultArr.push([data[i][0],data[0][j],cellVal]);
            }
          }
        }
      }

  }

Я хочу, чтобы выходные данные отправили последние четыре файла на диске Google на электронную почту.

Ответы [ 3 ]

2 голосов
/ 05 июля 2019

Попробуйте это:

function getLastFourMonthFileIds(){
  var nA=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Nov','Dec'];
  var mA=[];
  for(var i=0;i<4;i++) {
    var dt=new Date(new Date().getFullYear(),new Date().getMonth()-i,new Date().getDate());
    mA.push(nA[dt.getMonth()]+dt.getFullYear());
  }
  var fA=[];
  var files = DriveApp.getFolderById("").getFilesByType(MimeType.GOOGLE_SHEETS);
  while(files.hasNext()) {
    var file=files.next();
    if(mA.indexOf(file.getName())>-1) {
      fA.push(file.getId());
    } 
  }
  Logger.log(fA);
  return fA();
}
2 голосов
/ 05 июля 2019
  • Вы хотите автоматически создать поисковый запрос, используя скрипт.
  • Вы хотите искать файлы, используя созданный поисковый запрос.
  • Например, когда сегодня июль 2019 года,Вы хотите создать поисковый запрос, как показано ниже.
    • 'title contains "Mar 2019" or title contains "Apr 2019" or title contains "May 2019" or title contains "Jun 2019"'

Если мое понимание верно, как насчет этой модификации?Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Точки модификации:

  • Сначала создается объект JSON следующим образом.
    • {0: "Jan", 1: "Feb", 2: "Mar", 3: "Apr", 4: "May", 5: "Jun", 6: "Jul", 7: "Aug", 8: "Sep", 9: "Oct", 10: "Nov", 11: "Dec"}.
    • Используя этот объект и объект даты, создаются имена файлов.

Сначалапожалуйста, проверьте значения вышеупомянутого объекта JSON, который я подготовил.Если есть значения модификации, пожалуйста, измените их.Если указаны неправильные значения, файлы не могут быть восстановлены.Пожалуйста, будьте осторожны.

Модифицированный скрипт:

Пожалуйста, измените следующим образом.

С:
var file, files = DriveApp.getFolderById("").searchFiles('title contains "Mar 2019" or title contains "Apr 2019" or title contains "May 2019" or title contains "Jun 2019"')
Кому:
var months = {0: "Jan", 1: "Feb", 2: "Mar", 3: "Apr", 4: "May", 5: "Jun", 6: "Jul", 7: "Aug", 8: "Sep", 9: "Oct", 10: "Nov", 11: "Dec"};
var date   = new Date();
var y  = date.getFullYear();
var m = date.getMonth();
var fileNames = [];
for (var i = 0; i < 4; i++) {
  m--; // For example, when today is July, you need June, May, Apr and Mar.
  if (m < 0) {
    m += 12;
    y--;
  }
  fileNames.push(months[m] + " " + y);
  //  m--; // For example, when today is July, you need July, June, May and Apr.
}
var searchQuery = fileNames.map(function(e) {return 'title contains "' + e + '"'}).join(" or ");
var file, files = DriveApp.getFolderById("root").searchFiles(searchQuery);

Примечание:

  • Я не мог понять о var spreadsheetNames = DriveApp.searchFiles(.Я думаю, что когда ваш скрипт сохраняется, возникает ошибка.
  • В этом примере сценария, когда сегодня июль, июнь, май, апрель и мартизвлекаться.Если вы хотите получить июль, июнь, май и апрель, пожалуйста, измените комментарии из m--; приведенного выше сценария.

Ссылки:

Если я неправильно понял ваш вопрос и это не то направление, которое вам нужно, я приношу свои извинения.

0 голосов
/ 05 июля 2019

Пример кода с использованием атрибута getLastUpdated().


function so5689562902() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "56895629";
  var sheet = ss.getSheetByName(sheetname);
  sheet.activate;

  // sundry variables
  var filearray = [];
  var filedetail = [];
  var emailarray = [];
  var emailattachments = [];
  var numberReq = 4;

  // get the files from the folder
  var folder = DriveApp.getFolderById("<<insert Folder ID>>");
  var files = folder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    filedetail=[];
    //Logger.log("DEBUG: file name: "+file.getName()+", file ID: "+file.getId()+", last updated: "+file.getLastUpdated());
    filedetail.push(file.getName());
    filedetail.push(file.getId());
    filedetail.push(file.getLastUpdated());
    // build cumulative array
    filearray.push(filedetail);
  }

  // sort the array by date updated
  filearray.sort(function(x,y){
    var xp = x[2];
    var yp = y[2];
    return xp == yp ? 0 : xp > yp ? -1 : 1;
  });

  // get just the first N files
  for (i=0;i<numberReq;i++){

    filedetail=[]; 
    filedetail.push(filearray[i][0] ); // name
    filedetail.push(filearray[i][1] ); // file ID
    filedetail.push(filearray[i][2] ); // last updated
    // build the array of email files
    emailarray.push(filedetail);
    emailattachments.push(filearray[i][1])
  }

  // display the details for proof
  //var arraylen = emailarray.length;
  //Logger.log("DEBUG: the array length = "+arraylen);
  //var targetrange = sheet.getRange(2,1,arraylen, 3);
  //Logger.log("DEBUG: the target range = "+targetrange.getA1Notation());
  //targetrange.setValues(emailarray);

  // sample sendEmail.
  // email attachments are included in the options
  //GmailApp.sendEmail(<<recipient>>, <<Subject>>,nonhtmlmessage, {from:senderemail,htmlBody: htmlmessage,name: senderName,replyTo:senderemail ,attachments: emailattachments  }); 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...