创建文件夹和日志详细信息到电子表格

时间:2018-01-08 12:35:33

标签: google-apps-script

我正在尝试编写一个脚本,在指定的父文件夹中的每个文件夹中创建一个子文件夹。这部分工作正常。但是,该脚本还需要将文件夹名称和URL记录到A和A列中的单独电子表格中。 B.这是我似乎无法工作的东西。我对JS仍然有点绿,所以任何帮助都会非常感激。

var folders = DriveApp.getFolderById('xxxxx').getFolders();
var ss = SpreadsheetApp.openByUrl('xxxxx').getSheetByName('Sheet1');
var counter = 0;  

while (folders.hasNext()){
  var folder = folders.next();
  var folderName = folder.getName();
  var folderUrl = folder.createFolder("Child Folder - " + folderName);
  counter++
    for (i = 0; i < counter.length; i++){
      var valueRange = ss.getRange(i,1,1,2);
      var values = [[folderName, folderUrl]];
      range.setValues(valueRange);
    }    
  }
}

1 个答案:

答案 0 :(得分:3)

这部分不正确:

var valueRange = ss.getRange(i,1,1,2);
var values = [[folderName, folderUrl]];
range.setValues(valueRange);

如果这是您的完整代码,则表示您未列出名为range的变量。其次,您使用的是valueRange而不是values。所以第三行应该是

valueRange.setValues(values)

另外,使用严格设置的范围和自定义阵列时要小心。数字行必须完全匹配数组顶级数字的长度,列必须完全匹配第二级数的长度。

换句话说:

array.length = total rows of range
array[i].length = highest number of columns of the range

所以首先创建你的values数组,然后你可以ss.getRange(i, 1, values.length, values[0].length)执行valueRange.setValues(values)

编辑:其他问题

for (i = 0; i < counter.length; i++){
  var valueRange = ss.getRange(i,1,1,2);
  var values = [[folderName, folderUrl]];
  range.setValues(valueRange);
}
  1. 此循环将始终覆盖第一行
  2. getRange(firstRow, firstColumn , numRows, numCols)每个人的最低可能数为1,但您有i = 0
  3. 此处不需要for循环。您可以直接输出到电子表格(效率不高,也可以针对Google推荐)或输出到新的2D数组(在Javascript中读取有关数组的push方法)。如果不做太多改变,你可以做到:

    counter = 1 // if you want to always overwrite row 1 in the spreadsheet
    //OR (use only 1 of these 2 lines)
    counter = ss.getLastRow() //if you always want to append after last row in spreadsheet
    
    while (folders.hasNext()){
      var folder = folders.next();
      var folderName = folder.getName();
      var folderUrl = folder.createFolder("Child Folder - " + folderName);
      counter++
      var values = [[folderName, folderUrl]]
      ss.getRange(counter, 1, 1, 2).setValues(values)
    }