【问题标题】:GAS Loop goes indefiniteGAS Loop 无限期
【发布时间】:2013-12-17 12:26:57
【问题描述】:

问题:- 我需要从一些 Google Drive 文件夹中获取最新创建的文档的名称和 ID。

解决方案:- 我无法找到一种简单的方法来获取它,因此,为文件夹中的文件创建了一个循环以获取最大日期 - 然后在文件夹中再次循环以匹配日期并记录名称和日期 - 下面的代码(当如前所述评论)适用于解决方案。

我没有用不同的文件夹名称重写整个代码,而是尝试为文件夹名称创建一个循环。

但是,应用程序脚本进入无限循环,发出最大执行时间限制消息。 任何帮助表示赞赏。

function Get_lastestdate() {

  //Define Spreadsheet and sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("PEOPLE");

  //comment from here to work properly
  for (var i =1; i < 4; i++) {

  if (i = 1) { var foldername = "Folder1"}
  if (i = 2) { var foldername = "Folder2"}
  if (i = 3) { var foldername = "Folder3"}
  // till here

  //Define folder and files
  var folder = DocsList.getFolder(foldername); //set folder name in case commenting.
  var lastfile = folder.getFiles();

  //Make a blank array
  var noofdaysarray = []
  var yeararray = []

  //Loop to get all No of days in a year & the year
  for (var i in lastfile) {
  noofdaysarray.push(Utilities.formatDate(lastfile[i].getDateCreated(),"GMT","D"));
  yeararray.push(Utilities.formatDate(lastfile[i].getDateCreated(),"GMT","y"));
  }

  //Get the max date from date and year
  var largestdate = Math.max.apply(Math, noofdaysarray);
  var largestyear = Math.max.apply(Math, yeararray);
  //Get maximum available date
  var matchcriteria = largestdate + largestyear

  //Again loop for matching criteria with the actual date uploaded
  for (var i in lastfile) {
  var lastdate = Utilities.formatDate(lastfile[i].getDateCreated(),"GMT","D");
  var lastyear = Utilities.formatDate(lastfile[i].getDateCreated(),"GMT","y");
  var wholedate = parseInt(lastdate) + parseInt(lastyear); //parseInt is for converting text to number

  //Get doc name if both dates matches
  if (wholedate == matchcriteria) {
  Logger.log(lastfile[i].getId());
  Logger.log(lastfile[i].getName());
  }
  }
 } //comment this as a part of loop

}

之间:- 如果有更简单的方法,请告诉我。

【问题讨论】:

标签: google-apps-script google-spreadsheet-api


【解决方案1】:

您可以使用 DocsList 检索最后修改的文件。你告诉过你想要最后创建的,但也许最后修改的可能有用。检查下面的代码:

function findLastModified() {
     //Retrieve folder
     var folder = DocsList.getFolderById("0B0kQD4hSd4KASUJKb2cya0NET1U");

     //Ask for 5 files
     var numberOfFiles = 5;

     //The first parameter is the search query, in this case we want all files
     var filesResult = folder.findForPaging("", 5);

     //By Default they will be sorted by last modified date
     var files = filesResult.getFiles();

     Logger.log("Found "+files.length+" files");

     //Iterate
     for(var x in files) {
       var file = files[x];
       Logger.log(file.getLastUpdated());
      }
    }

直播版here.

【讨论】:

  • 很好,这似乎可行,但是 5 in ask for 5 个文件是什么意思;我的意思是代码只会查看 5 个文件,在这种情况下,如果文件超过 5 个,可能会出现问题,对吧?
  • 5 是分页大小。 developers.google.com/apps-script/reference/docs-list/… 这应该不是问题,因为它正在查看已排序列表的前 5 个。 (但修改日期不是创建日期)
  • 不适用于某些文件夹,附上Execution Transcript 任何特殊原因。它有 3 个 Google 演示文稿。
  • 应该与所有人一起工作,您只更改了文件夹 ID?里面有哪些文件?
  • 在函数 findForPaging 的第一个参数中尝试输入一个演示文稿的名称并告诉我们结果
【解决方案2】:

不要在内部和外部循环中使用“i”。这将是一个问题。

这样你只做一个循环不是更容易吗?

var mostRecentDate = new Date(2000,01,01);
var fileName="";
var fileId="";

for(var i = 1; i<5; i++){

   var folder = DocsList.getFolder('Folder'+i);
   var files = folder.getFiles();
   for(var j in files) {
      if(files[j].getDateCreated()>mostRecentDate){  //or getLastUpdated
         mostRecentDate=files[j].getDateCreated();
         fileName=files[j].getName();
         fileId=files[j].getId();
       }

    }
}
Logger.log("File: " + filename + " Id: " + fileId + " Created: " + mostRecentDate);

如果您有大量文件和文件夹要遍历,您可能需要进行分页。

【讨论】:

  • 谢谢,我添加了 var fileId="";在第 3 行,但是日志显示“[13-12-17 18:51:40:040 IST] 文件:ID:创建:Tue Feb 01 2000 00:00:00 GMT+0530 (IST)”,我也试过 chagning新日期到今天的日期(以防万一),但仍然是相同的消息,但创建日期不同。
  • 我没有测试此代码 - 将 if(files.getDateCreated... 更改为 if(files[j].getDateCreated...
  • 代码不能按要求工作,但需要注意,使 i 变量使用了两次以引起注意。
  • 另一个错误... files[j].getDateCreated 应该是 files[j].getDateCreated() - 我缺少 getDateCreated 函数上的括号。这就是你刚开始输入 sudo-code 并让它太接近真实的东西时得到的结果 lol
  • “TypeError:在“mostRecentDate=files.getDateCreated();”上的对象 File、File、File 中找不到函数 getDateCreated行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多