【问题标题】:How to apply a Google Script across all sheets in a folder如何在文件夹中的所有工作表上应用 Google 脚本
【发布时间】:2021-06-15 05:26:41
【问题描述】:

我是脚本的新手。我有一个脚本(pasteValues)

  1. 查看活动电子表格
  2. 粘贴值,使所有公式变为静态值。
  3. 将超链接公式插入特定的命名单元格(本例中为 L3)。
 function onOpen() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
  var pasteValues = [ {name: "Paste Values", functionName: "pasteValues"}];
  ss.addMenu("Paste Values", pasteValues);
}


     function pasteValues() {
        var spreadsheet = SpreadsheetApp.getActive();
      var currentCell = spreadsheet.getCurrentCell();
      spreadsheet.getActiveRange().getDataRegion().activate();
      currentCell.activateAsCurrentCell();
      currentCell = spreadsheet.getCurrentCell();
      var sheet = spreadsheet.getActiveSheet();
      sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
      currentCell.activateAsCurrentCell();
      sheet = spreadsheet.getActiveSheet();
      sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  
  var cell = sheet.getRange("L3");
cell.setFormula('=HYPERLINK("https://docs.google.com/spreadsheets/d/11wN66ClYQf4soG6UnlWrqBz5hSMSj0c8ceI_0Zt-s7o/","Link to Master Schedule")')
}

;

我目前已经在 100 多个不同的电子表格上安装了此脚本,并使用菜单选项来运行脚本(我打开每个电子表格并通过“onOpen”脚本中生成的菜单选项卡运行脚本)。

我想做的就是能够

  1. 打开我的主表(称为“示例计划”)
  2. 在与“Sample Schedule”位于同一文件夹中的所有工作表中运行 pastevalues 函数脚本(最好通过菜单选项卡访问)
  3. 但 pastevalues 函数只能用于特定命名的工作表。 (即,每张工作表都有 10 个或更多选项卡,名为“Summer 2021”的选项卡是我想在其上使用 pastevalues 功能的选项卡。此选项卡名称在文件夹中的所有工作表中都是一致的。

我目前有一个脚本(安装在“示例计划”上,我已经使用了一段时间,它将示例计划的活动选项卡复制到文件夹中的所有工作表。这是目前正在努力实现的目标:

function copySheet() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = source.getSheets()[0];
  var sourceFile = DriveApp.getFileById(source.getId());
  var sourceFolder = sourceFile.getParents().next();
  var folderFiles = sourceFolder.getFiles();
  var thisFile;

  while (folderFiles.hasNext()) {
    thisFile = folderFiles.next();
    if (thisFile.getName() !== sourceFile.getName()){
      var currentSS = SpreadsheetApp.openById(thisFile.getId());
      sheet.copyTo(currentSS);
      currentSS.getSheets()[currentSS.getSheets().length-1].setName('Summer 2021').activate();
      currentSS.moveActiveSheet(1);
    }    
  };    
}

但我未能将此脚本改编为我的新“PasteValues”脚本。

我在 Stack Overflow 上查看了很多关于如何在同一个文件夹中跨多个工作表运行函数的答案,但我无法做到(我只是设法制作粘贴值(粘贴值+ 特定单元格工作中的超链接)。几个月来,我一直在努力实现这一目标,而我有空闲时间,但如果有人能帮助我,那就太好了。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我相信你的目标如下。

    • 您想要检索具有活动电子表格的特定文件夹下的 Google 电子表格文件。
    • 对于每个电子表格中Summer 2021 的特定工作表,您希望复制当前值和不带公式的显示值。而且,您想在“L3”单元格中输入一个公式。

    修改点:

    • 在这种情况下,我一开始认为是需要降低您当前脚本的处理成本。在这种情况下,我修改如下。

        var sheet = SpreadsheetApp.getActiveSheet()
        var range = sheet.getDataRange();
        range.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
        sheet.getRange("L3").setFormula('=HYPERLINK("https://docs.google.com/spreadsheets/d/###/","Link to Master Schedule")');
      

    使用上面修改过的脚本,我修改了你的脚本的copySheet()如下。

    修改脚本:

    function onOpen() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var pasteValues = [{ name: "Paste Values", functionName: "pasteValues" }];
      ss.addMenu("Paste Values", pasteValues);
    }
    
    function pasteValues() {
      var sheetName = "Summer 2021";
    
      // 1. Retrieve the parent folder of active Spreadsheet.
      var source = SpreadsheetApp.getActiveSpreadsheet();
      var sourceFile = DriveApp.getFileById(source.getId());
      var sourceFolder = sourceFile.getParents().next();
      
      // 2. Retrieve all Google Spreadsheet files under the folder which has the active Spreadsheet.
      var files = sourceFolder.getFilesByType(MimeType.GOOGLE_SHEETS);
      while (files.hasNext()) {
        
        // 3. Run the script you want to run each Spreadsheet.
        var sheet = SpreadsheetApp.open(files.next()).getSheetByName(sheetName);
        if (sheet) {
          var range = sheet.getDataRange();
          range.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
          sheet.getRange("L3").setFormula('=HYPERLINK("https://docs.google.com/spreadsheets/d/11wN66ClYQf4soG6UnlWrqBz5hSMSj0c8ceI_0Zt-s7o/","Link to Master Schedule")');
        }
      }
    }
    
    • 当您运行pasteValues() 时,会运行以下流程。

      1. 检索活动电子表格的父文件夹。
      2. 检索具有活动电子表格的文件夹下的所有 Google 电子表格文件。
      3. 运行要运行每个电子表格的脚本。

    注意:

    • 关于您的问题中的100+ different spreadsheets,不幸的是,我不确定上述脚本是否适用于一次执行中的所有电子表格。在我的环境中,使用 10 个电子表格时,处理时间约为 25 秒。从这种情况来看,我认为 100 个电子表格文件可能会起作用。但是,当您对此进行测试时,当无法完成所有电子表格时,我认为可能需要使用时间驱动触发器。

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2013-10-14
      • 2021-08-30
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      相关资源
      最近更新 更多