Google apps script 我需要使用脚本将谷歌电子表格的副本保存到特定目录

Google apps script 我需要使用脚本将谷歌电子表格的副本保存到特定目录,google-apps-script,google-drive-api,google-sheets,google-docs,Google Apps Script,Google Drive Api,Google Sheets,Google Docs,我们目前有一个夜间平衡流程,在该流程中,我们打开一个Excel模板电子表格,输入正确的处理日期,然后单击一个按钮,导致VB脚本启动,并在适当的文件夹中创建具有适当名称(如“BAL 080114”)的电子表格的新副本,然后将其打开,此时,操作员将关闭模板,并在新副本中继续工作 文件夹结构为: Drive --->Ops Room ------->Procedural Sheets ----------->Night Shift --------------->Balanci

我们目前有一个夜间平衡流程,在该流程中,我们打开一个Excel模板电子表格,输入正确的处理日期,然后单击一个按钮,导致VB脚本启动,并在适当的文件夹中创建具有适当名称(如“BAL 080114”)的电子表格的新副本,然后将其打开,此时,操作员将关闭模板,并在新副本中继续工作

文件夹结构为:

Drive
--->Ops Room
------->Procedural Sheets
----------->Night Shift
--------------->Balancing
------------------->2014
----------------------->01-2014
...
----------------------->12-2014
我们正在尝试将其转换为Google docs电子表格,而且大部分情况下都能正常工作。但是我找不到一种方法允许某人打开模板(存储在平衡中),运行“开始新的一天”脚本,并让脚本在适当的子文件夹中创建文件。也就是说,对于2014年1月8日,该文件应以Bal 080114的形式存储在Balance/2014/08-2014中

这就是我到目前为止所做的:

function startNewDay() {
  // This code makes a copy of the current spreadsheet and names it appropriately
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // The file name is created and stored on sheet "Set Date" in cell B5
  var fname = ss.getSheetByName("Set Date").getRange("B5").getValue();
  var folderYear = Utilities.formatDate(new Date(), "GMT-6", "yyyy"); // top-level folder is by year in yyyy format
  var folderMonth = Utilities.formatDate(new Date(), "GMT-6", "MM-yyyy"); // folder name is in mm-yyyy format
  //the above is probably overkill, but I'll work on efficiency once I get it working at all :
  //Everything works up to this point...

  //This is where I start running into problems...
  //The Master Copy SSID is <redacted>
  var SSID = '<redacted>'
  var folder = DocsList.getFolder(folderYear + "/" + folderMonth); 
  var backup = DocsList.getFileById(SSID).makeCopy(fname);
  backup.addToFolder(folder); //This line will move the file to the appropriate folder
  backup.removeFromFolder(DocsList.getRootFolder()); //This line is needed to remove the File from the Root
}
函数startNewDay(){
//此代码创建当前电子表格的副本并对其进行适当命名
var ss=SpreadsheetApp.getActiveSpreadsheet();
//文件名创建并存储在单元格B5的“设置日期”页上
var fname=ss.getSheetByName(“设置日期”).getRange(“B5”).getValue();
var folderYear=Utilities.formatDate(new Date(),“GMT-6”,“yyyy”);//顶级文件夹以yyyy格式按年显示
var folderMonth=Utilities.formatDate(新日期(),“GMT-6”,“MM yyyy”);//文件夹名称为MM yyyy格式
//以上可能有些过火,但一旦我让效率发挥作用,我会努力提高效率:
//到目前为止一切正常。。。
//这就是我开始遇到问题的地方。。。
//主副本SSID为
var SSID=''
var folder=DocsList.getFolder(folderYear+“/”+folderMonth);
var backup=DocsList.getFileById(SSID).makeCopy(fname);
backup.addToFolder(folder);//此行将文件移动到适当的文件夹中
backup.removeFromFolder(DocsList.getRootFolder());//从根目录中删除文件需要此行
}
我从另一个具有类似属性的StackOverFlow应答中借用了backup.*内容,但我的版本没有创建该文件

我在开车的时候想做的事可能吗?或者我只需要让操作员创建一个副本,然后手动移动它

我为自己对脚本编程的无知表示歉意——我本周刚开始学习Google脚本,我很难与以前的VB经验找到共同点

提前感谢您的帮助


詹姆斯

我无法发表评论,因此我无法补充已经存在的内容

“手动”创建的文件夹是否由正确的人以正确的权限创建?共享文件夹在Google Drive上可能会变得棘手

我甚至可能会提出类似建议,让脚本为您创建文件夹:

/*********************************************************
 * Function to determine the destination folder based on
 *   provided criteria.
 *
 * @param {Folder} root The root folder.
 * @param {String} folderYear The year of the report.
 * @param {String} folderMonth The month of the report.
 * @return {Folder} Destination Folder.
 *********************************************************/
function returnFolder(root, folderYear, folderMonth) {
  var dir      = DocsList.getFolderById(root);
  var folders  = DocsList.getFolderById(root).getFolders();
  var found    = false;
  var toReturn = "";

  for (var i = 0; i < folders.length; i++) {
    if (folders[i].getName() == folderYear) {
      dir      = folders[i];
      found    = true;
      break;
    }
  }

  if (!found) {
    dir = dir.createFolder(folderYear);
    folders = dir.getFolders();
  }
  else found = false;

  for (var i = 0; i < folders.length; i++)
    if (folders[i].getName() == folderMonth) {
      toReturn = folders[i].getId();
      found    = true;
      break;
    }

  if (!found) toReturn = dir.createFolder(folderMonth).getId();
  return DocsList.getFolderById(toReturn);
}
/*********************************************************
*函数根据以下内容确定目标文件夹:
*提供了标准。
*
*@param{Folder}root根文件夹。
*@param{String}folderYear报告年份。
*@param{String}folderMonth报告月份。
*@return{Folder}目标文件夹。
*********************************************************/
函数returnFolder(root、folderYear、folderMonth){
var dir=DocsList.getFolderById(根);
var folders=DocsList.getFolderById(root.getFolders();
var=false;
var toReturn=“”;
对于(var i=0;i
那么您的代码如下所示:

var SSID = '<redacted>'
var folder = returnFolder(OBJECT_PARENT_FOLDER, folderYear, folderMonth);
var backup = DocsList.getFileById(SSID).makeCopy(fname);
backup.addToFolder(folder); //This line will move the file to the appropriate folder
backup.removeFromFolder(DocsList.getRootFolder()); //This line is needed to remove the File from the Root
var SSID=''
var folder=returnFolder(OBJECT\u PARENT\u folder,folderYear,folderMonth);
var backup=DocsList.getFileById(SSID).makeCopy(fname);
backup.addToFolder(文件夹)//此行将文件移动到适当的文件夹中
backup.removeFromFolder(DocsList.getRootFolder())//从根目录中删除文件需要这一行

您需要将代码与您的需要相匹配,但我希望这会有所帮助。

您的错误消息/问题/挑战是什么?如果您的问题是:我是否可以在GDrive中复制一个文件并将其保存到GDrive上的某个位置(如果我错了,请更正我),那么答案是肯定的。问题是您正在使用的ssid…这不是有效的ssid,请使用ss.getId获取它()您将了解我的意思。使用Logger.log(ss.getId())再看看日志。辅助问题:目标文件夹已经存在吗?Matcheek-问题是文件没有在我需要的目录中创建。Serge-意味着我在其中的SSID由于隐私问题被删除-我不能允许电子表格公开。我有一个工作的SID.附属问题的答案:是的。首先,感谢您提供的代码!不幸的是,我遇到了一个奇怪的错误。即使我使用“var OBJECT_PARENT_FOLDER=DocsList.getFolderById(idName);”(其中idName是我/过程表的SSID),您创建的returnFolder函数也会告诉我“找不到具有给定ID的项目,或者您没有访问它的权限”在“var dir=”语句中。我创建了/Procedural Sheets文件夹,因此我应该拥有它的根权限。有什么想法吗?忘了将其放入:我执行了两个Logger.Log命令:Logger.Log(OBJECT\u PARENT\u folder)和Logger.Log(OBJECT\u PARENT\u folder.getName());在对象变量上,它报告它实际上是正确的文件夹名。@J.Moore您好,对不起。我想我不是