如何使用已经包含脚本的新gsheet?

扎克·亨森(Zac Henson)

我有一个系统,可以自动将文件上传到Gdrive,Gdrive可以搜索这些文件,将它们组合在一起,然后将模板表添加到组合表中。

在模板gsheet中,我需要能够引用其他选项卡中的单元格而不使用选项卡名称(选项卡名称将一直更改)。我知道如何执行此操作的唯一方法是使用gsheet中的Google Apps脚本。问题是我生成模板的方式是打开模板,然后将所有值复制到新创建的组合gsheet中的新标签中,并且它不会复制google apps脚本。

即使我可以使用代码将脚本自动添加到新工作表中,我仍然需要该脚本自动在该工作表上运行,因为我还有另一个主表可以查找所有新创建的文件并添加所有文件的摘要信息。

这是我的Gdrive脚本(如果有帮助的话)。

/* Head Master Info >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */

/* Top Level Google Drive Folder ID */
var TopDriveFolderID = "0B2rN5b8fW77ldXZXOXFLZGlSamc";
var BaseNumberOfFilesInFolder = 4;
var NewSSAnalyzerSheetId = "1VyL8XL1x41H6yetcrwfUhVcch-DUsngY4-bHCbo-_xM";

/* End Head Master Info >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

/* Body >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

/* Functions to iterate through all sub folders */
function listFolders() {
  var parentFolder = DriveApp.getFolderById(TopDriveFolderID);
  var childFolders = parentFolder.getFolders();
  while(childFolders.hasNext()) {
    var child = childFolders.next();
    //    Logger.log(child.getName() + " |Drive_ID: " + child.getId());
    var folderId = child.getId();
    // **the folderId Variable is also the folder ID,
    //    hence they are used interchangeably **
    
    /* SpreadSheet Combiner >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/    
    
    /* Name of combined Spreadsheet*/
    var newSpreadSheetName = DriveApp.getFolderById(folderId).getName();

    /* Retrieve the desired folder */
    var myFolder = DriveApp.getFolderById(folderId);
    
    /* Get all spreadsheets that resided on that folder */
    var spreadSheets = myFolder.getFilesByType("application/vnd.google-apps.spreadsheet");
    var spreadSheetName = myFolder.getName();
    //    Logger.log(spreadSheetName);
    
    /* Check if a file needs to be created or if one already exists*/  
    var theFolder = DriveApp.getFolderById(folderId);
    var files = theFolder.getFiles();
    var fname = theFolder.getName();
    
    var cnt = 0;
    var file;
    
    /* Check the quantity of files in a folder to see if you need to combine the sheets and create a file*/  
    while (files.hasNext()) {
      cnt++;
      file = files.next();
      //Logger.log(file.getName());
      if (cnt > BaseNumberOfFilesInFolder) {
        Logger.log("File already exists")
        break;
      } 
      ;
    };
    
    // If a file needs to be created this checks it and creates it
    Logger.log(cnt + " is the number of files '"+ newSpreadSheetName+ "' has.");
    if (cnt > BaseNumberOfFilesInFolder){     
      Logger.log("No file needs to be created")
    }else{
      
      /* Create the new spreadsheet that you store other sheets */ 
      var newSpreadSheet = SpreadsheetApp.create(newSpreadSheetName);
      
      
      /* Iterate over the spreadsheets over the folder */
      while(spreadSheets.hasNext()) {
        
        var sheet = spreadSheets.next();
        
        /* Open the spreadsheet */
        var spreadSheet = SpreadsheetApp.openById(sheet.getId());
        
        
        /* Get all its sheets */
        for(var y in spreadSheet.getSheets()) {
          
          /* Copy the sheet to the new merged Spread Sheet */
          spreadSheet.getSheets()[y].copyTo(newSpreadSheet);
          
          
          /* In order to move the file to the folder we want and because 
          google considers the SpreadSheet a Google Spreadsheet
          instead of a file, we have to convert the SpreadSheet to a file in
          order to move it.Thats what the next 2 lines of code do.*/
          var getNewSSid = newSpreadSheet.getId();
          var SStoGFile = DriveApp.getFileById(getNewSSid);
          /* Actually moving the file*/
          DriveApp.getFolderById(folderId).addFile(SStoGFile);
          /* Deleting the duplicate file that was created in the process*/
          var rootFolder = DriveApp.getRootFolder();
          DriveApp.getRootFolder().removeFile(SStoGFile);
          
        }
      } 
      
      /*Code to add our base analysis template to the new combined template that was created;*/
      //Grabs the template
      var sss = SpreadsheetApp.openById(NewSSAnalyzerSheetId); //replace with source ID
      var ss = sss.getSheetByName('Analysis Tab'); //replace with source Sheet tab name
      var range = ss.getRange('A1:E6'); //assign the range you want to copy
      var data = range.getValues();
      
      //Copies the template info into the current newly created sheet
      var tssId = newSpreadSheet.getId();
      var tss = SpreadsheetApp.openById(tssId); //replace with destination ID
      var ts = tss.getSheetByName('Sheet1'); //replace with destination Sheet tab name
      ts.getRange(1,1,6,5).setValues(data); //you will need to define the size of the copied data see getRange()
      

      Logger.log("New File was created with the name - " + newSpreadSheetName)
    }
  };
  
  
  /* End SpreadSheet Combiner >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/       
  
  
  getSubFolders(child); 
  
}


 /* Necessary Function to help the above loop through the sub folders */
function getSubFolders(parent) {
  parent = parent.getId();
  var childFolder = DriveApp.getFolderById(parent).getFolders();
  while(childFolder.hasNext()) {
    var child = childFolder.next();
    Logger.log(child.getName());
    getSubFolders(child);
  }
  return;
}

/* End iterate through Sub Folders */

杰里米

不使用SpreadsheetApp.create()而是使用DriveApp.getFileById()。makeCopy()怎么样?然后,制作电子表格时,便可以在电子表格中拥有想要的任何脚本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用脚本/宏在特定的 GSheet 列中查找和替换?

如何使谷歌应用程序脚本 - 日历 createEvent() 接受来自使用数组公式填充的单元格的 GSheet 输入

JMockit:如何使用新的模拟替代已经模拟的方法?

如何附加到已经运行的R脚本

如何导入已经从父脚本导入的库?

如果目录已经存在,如何退出脚本?

如何仅使用脚本在首页中包含页眉

如何使用用户脚本在 Google 中包含 jQuery?

GSheet 脚本:如何优化我的行和工作表迭代器

在Google Apps脚本网络应用中使用Google Visualization API显示GSheet范围时出错

如果表已经多于一行,如何使用jquery向表中添加新行

如何使用传递给构造函数的新实例覆盖已经在LightInject中注册的类型?

如何使用pymongo在已经初始化的副本集中的mongo中添加新节点?

如何使用回送向已经存在的模型添加新属性

如何使用仅包含键的项目列表创建新变量

如何不使用 php 脚本创建新行

如何使用脚本中的参数启动新的Powershell窗口?

如何使用PPI向Perl脚本添加新行?

如何使用 SQL 脚本中的新值更新 XML 元素

如何使用Shell脚本在新终端中发送输入

Google表格脚本:如何在新行中包含引用该新行中的单元格的公式?

当他已经有信息时,如何使用 javascript 检查共享点列表是否包含特定单词

如何使GSheet提取操作更快?

当我已经使用echo“ password”自动通过身份验证时,如何编写安装程序的“是”响应的脚本

如何使用mod_rewrite从旧的php脚本重定向到新的php脚本

Cloudformation脚本堆栈构建使用现有的s3存储桶而不是创建新的存储桶(错误:s3-bucket-name已经存在)

如何使下拉菜单不包含标题(如果已经存在)

如果多行已经包含评论,如何在 sublime 中评论?

如何检查json数组是否已经包含某个键?