Javascript 尝试复制文件夹时出现Google Sheets脚本错误

Javascript 尝试复制文件夹时出现Google Sheets脚本错误,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,问题1: 当我尝试执行下面的代码时,它会出现错误“Exception:Invalid argument:name(第37行,文件“createnewproject”)”。我最初认为变量“jobNumber”可能不是字符串,但现在它是了,它仍然不会执行 问题2: 当我不使用变量'jobNumber'作为文件夹名称,而只使用字符串值时,它会执行。但是,新文件夹不会进入源文件夹驱动器,而是进入我的个人驱动器 function createProject(){ searchProject(); cr

问题1: 当我尝试执行下面的代码时,它会出现错误“Exception:Invalid argument:name(第37行,文件“createnewproject”)”。我最初认为变量“jobNumber”可能不是字符串,但现在它是了,它仍然不会执行

问题2: 当我不使用变量'jobNumber'作为文件夹名称,而只使用字符串值时,它会执行。但是,新文件夹不会进入源文件夹驱动器,而是进入我的个人驱动器

function createProject(){
 searchProject();
 createFolder();
 
}

//Search for New Project and return values
function searchProject(){
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var search = "New Job";
  
  for(var i = 0; i<data.length;i++){
    if(data[i][9] == search){ 
      Logger.log((i+1));
      var jobNumber = sheet.getRange((i+1), 1).getDisplayValue()
      var jobSite = sheet.getRange((i+1), 2).getDisplayValue()
      var jobTitle = sheet.getRange((i+1), 3).getDisplayValue()
      return i+1;

    }
  }
  
}

//Create New Project Folders       
function createFolder(jobNumber, jobSite, jobTitle) {

  var sourceFolder = "12345_Site Name_Commissioning Engineer Name";
  var targetFolder = jobNumber
  var source = DriveApp.getFoldersByName(sourceFolder);
  var target = DriveApp.createFolder(targetFolder);
  
  if (source.hasNext()) {
    copyFolder(source.next(), target);
  }
}

function copyFolder(source, target) {

  var folders = source.getFolders();
  var files   = source.getFiles();

  while(files.hasNext()) {
    var file = files.next();
    file.makeCopy(file.getName(), target);
  }

  while(folders.hasNext()) {
    var subFolder = folders.next();
    var folderName = subFolder.getName();
    var targetFolder = target.createFolder(folderName);
    copyFolder(subFolder, targetFolder);
  }

}
函数createProject(){
搜索项目();
createFolder();
}
//搜索新项目并返回值
功能搜索项目(){
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data=sheet.getDataRange().getValues();
var search=“新工作”;

对于(var i=0;i我已经设法找到了自己的解决方案。 通过添加'foler_ID'和'folder'变量,使文件夹进入google drive中的正确文件夹

我还错过了在searchProject函数中调用creatFolder函数,现在包含了该函数,变量被带入

感谢所有提供帮助的贡献者:)

/**
*创建新项目
*/ 
//搜索新项目并返回值
函数createProject(){
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data=sheet.getDataRange().getValues();
var search=“新工作”;

对于(var i=0;iBy使用“.getDisplayValue”,我认为这是string,我建议您添加一个包括记录单元格值和数据类型的(你可以使用
typeof
是的,你是对的,我有另一个从ui菜单调用的函数。我删除了我的答案,因为它看起来不再有效。我建议你更新你的问题以显示当前。你定义
jobNumber
和在函数中使用的方式非常混乱。你定义了函数中的变量,因此它在该函数的范围内。关于第二个问题,请进一步解释您想做什么?文件夹是在您的个人驱动器中还是在共享驱动器中?
/**
 * Create New Project
 */ 

//Search for New Project and return values
function createProject(){
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var search = "New Job";
  
  for(var i = 0; i<data.length;i++){
    if(data[i][9] == search){ 
      Logger.log((i+1));
      var jobNumber = sheet.getRange((i+1), 1).getDisplayValue()
      var jobSite = sheet.getRange((i+1), 2).getDisplayValue()
      var jobTitle = sheet.getRange((i+1), 3).getDisplayValue()
      
      createFolder (jobNumber, jobSite, jobTitle);
      
      Logger.log(jobNumber);
      Logger.log(jobSite);
      Logger.log(jobTitle);
      
      return i+1;
    }
  }
  
}

//Create New Project Folders       
function createFolder(jobNumber, jobSite, jobTitle) {

  var sourceFolder = "12345_Site Name_Commissioning Engineer Name";
  var targetFolder = (jobNumber + " " + jobSite + " " + jobTitle + "TESTING");
  var foler_ID = '14QpCYc803GnDC_pR-7AqViePHBKyNNv_';
  var folder = DriveApp.getFolderById(foler_ID);

  var source = DriveApp.getFoldersByName(sourceFolder);
  var target = folder.createFolder(targetFolder);
  Logger.log(target);

  if (source.hasNext()) {
    copyFolder(source.next(), target);
  }
}

function copyFolder(source, target) {

  var folders = source.getFolders();
  var files   = source.getFiles();

  while(files.hasNext()) {
    var file = files.next();
    file.makeCopy(file.getName(), target);
  }

  while(folders.hasNext()) {
    var subFolder = folders.next();
    var folderName = subFolder.getName();
    var targetFolder = target.createFolder(folderName);
    copyFolder(subFolder, targetFolder);
  }

}