对于if / else语句未按预期工作的循环

时间:2015-10-04 18:10:12

标签: javascript google-apps-script

我正在努力的功能是脚本的一部分,该脚本创建文件夹并将某个电子表格复制到每个文件夹中15次并命名它们。

我有一个创建文件的循环,在其中我有一个if..then..else语句,如果j>10使用某个名称,而另一个名称(如果是)则使用其他名称不。它总是将文件命名为一个名称,如果j超过10,它似乎无法识别if / else语句来更改名称。

基本上我想要的是命名文件

var namedFileCopy = fileCopy.setName(newFileName);

如果j小于10并且......

var _namedFileCopy = fileCopy.setName("_" + newFileName); 

如果j不小于10

我想知道我是否需要在某处添加休息时间,但我并不熟悉如何使用休息时间。

这是给我一个问题的功能,您可以在其后面的代码段中找到我的所有代码。

function putFilesIntoFolders(arrayOfFolderNames,theFolderNames,cell) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var theSheet = ss.getSheetByName('Sheet1');
  var folderType = theSheet.getRange(2,1);
  var cell = folderType.getValue();
  var file = DriveApp.getFileById("ID");
  var dest_folder  = "";

  var baseFileName = "",
      newfile,
      newFileName = "",
      i=0,
      j=0;

  for (i=0;i<arrayOfFolderNames.length;i+=1) {
    var source_folder = DriveApp.getFolderById("ID");
    dest_folder  = DriveApp.getFolderById(folderIds[i]);
    Logger.log('dest_folder' + dest_folder);

    baseFileName = arrayOfFolderNames[i];

    for (j=1; j<16; j+=1) {
      var newFileName = baseFileName + " " + cell + " " + j.toString();
      var fileCopy = file.makeCopy();
      var namedFileCopy = fileCopy.setName(newFileName);
      var _namedFileCopy = fileCopy.setName("_" + newFileName);

      if (j<10) {
          dest_folder.addFile(namedFileCopy);
          source_folder.removeFile(fileCopy); 
      }  else {
          dest_folder.addFile(_namedFileCopy);
          source_folder.removeFile(fileCopy);
      };
    };
  };
};

&#13;
&#13;
  var folderIds = [];

function onOpen(e) {
   SpreadsheetApp.getUi()
    .createMenu('Data System Tool')
       .addItem('Create Data System Folders', 'copyAndRenameTemplate')
       .addToUi();
}

function copyAndRenameTemplate() {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var theSheet = ss.getSheetByName('Sheet1');
  var rangeOfFileNames = ss.getRange("B4:B");
  var twoD_Array = rangeOfFileNames.getValues();
  var arrayOfFileNames = twoD_Array.join().split(",");
  var folderType = theSheet.getRange(2,1);
  var cell = folderType.getValue();

  Logger.log(folderType);
  Logger.log(cell);
  
//  throw new Error('This is not an error. This is just to abort javascript');
  
  var fldrNamesRng  = theSheet.getRange(4,1,theSheet.getLastRow()-3,1);
  Logger.log('fldrNamesRng: ' + fldrNamesRng);
  
  var folderNames  = fldrNamesRng.getValues();
  Logger.log('folderNames: ' + folderNames);
  
  var oneD_FolderNames = folderNames.join().split(",");
  Logger.log('oneD_FolderNames: ' + oneD_FolderNames);
  
  makeTheFolders(oneD_FolderNames);
  putFilesIntoFolders(oneD_FolderNames);
};

function makeTheFolders(theFolderNames,cell) {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var theSheet = ss.getSheetByName('Sheet1');
  var folderType = theSheet.getRange(2,1);
  var cell = folderType.getValue();
  
  var i=0,
      folderObj;
  
  for (i=0;i<theFolderNames.length;i+=1) {
    folderObj = DriveApp.createFolder(theFolderNames[i] + " " + cell);
    
    folderIds.push(folderObj.getId())
  };
};

function putFilesIntoFolders(arrayOfFolderNames,theFolderNames,cell) {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var theSheet = ss.getSheetByName('Sheet1');
  var folderType = theSheet.getRange(2,1);
  var cell = folderType.getValue();
  var file = DriveApp.getFileById("ID");
  var dest_folder  = "";
  
  var baseFileName = "",
      newfile,
      newFileName = "",
      i=0,
      j=0;
  
  for (i=0;i<arrayOfFolderNames.length;i+=1) {
    var source_folder = DriveApp.getFolderById("ID");
    dest_folder  = DriveApp.getFolderById(folderIds[i]);
    Logger.log('dest_folder' + dest_folder);
    
    baseFileName = arrayOfFolderNames[i];
    
    for (j=1; j<16; j+=1) {
      var newFileName = baseFileName + " " + cell + " " + j.toString();
      var fileCopy = file.makeCopy();
      var namedFileCopy = fileCopy.setName(newFileName);
      var _namedFileCopy = fileCopy.setName("_" + newFileName);
     
      if (j<10) {
          dest_folder.addFile(namedFileCopy);
          source_folder.removeFile(fileCopy); 
      }  else {
          dest_folder.addFile(_namedFileCopy);
          source_folder.removeFile(fileCopy);
      };
    };
  };
};
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

fileCopy.setName()更改文件对象的filename属性。您应该将调用移到条件分支内的fileCopy.setName()。

答案 1 :(得分:0)

你的循环没有问题,不需要break;。 您的问题出现在以下代码行中:

  var fileCopy = file.makeCopy();
  var namedFileCopy = fileCopy.setName(newFileName);
  var _namedFileCopy = fileCopy.setName("_" + newFileName);

makeCopy()方法将创建一个新文件对象,代表Google云端硬盘中的新文件。

之后,在setName()对象上调用fileCopy方法,该方法会更改关联文件的名称。这很好,除了你已经将方法调用的返回值赋给了一个新变量namedFileCopy。您现在有两个引用同一对象的变量,因为此方法只返回原始对象以进行链接。 (链接是在同一语句中对on对象调用多个方法的时候;只有当每个方法返回下一个方法的原始对象引用时才有可能。)

接下来,您再次致电setName() fileCopy,将返回值分配给_namedFileCopy;这是完全相同对象的第三个引用。哦,那个文件 - 所有三个对象引用都指向的文件 - 现在用下划线命名。

在此之后,您的if..then..else注定要使用下划线命名生成的文件。实际上......从上面的第三个操作开始,文件已经用下划线命名。

分开关注更多;你必须对文件名做出决定,所以要孤立地做。一旦您完成了这个问题,您就可以操作该文件,这是一个单独的问题。

结果循环应该如下所示:

  for (i=0; i<arrayOfFolderNames.length; i++) {
    var source_folder = DriveApp.getFolderById("ID");
    dest_folder  = DriveApp.getFolderById(folderIds[i]);
    Logger.log('dest_folder' + dest_folder);

    baseFileName = arrayOfFolderNames[i];

    for (j=1; j<16; j++) {
      // Determine the name for the new file
      var newFileName =  baseFileName + " " + cell + " " + j.toString();
      // Prepend file name with underscore if j >= 10
      if (j >= 10) newFileName = "_" + newFileName;

      // Copy "file" and apply our newFileName, then move to new destination.
      var fileCopy = file.makeCopy()
                         .setName(newFileName);

      dest_folder.addFile(fileCopy);
      source_folder.removeFile(fileCopy); 
    }
  }

(我怀疑这是Alvaz回答的内容。)