如何更快地从电子表格中调用多个工作表并在 if 语句中使用它们

问题描述 投票:0回答:1

我有一个脚本可以复制一个电子表格,然后根据初始工作表中的一些复选框删除/隐藏它的一些工作表。

我正在调用许多工作表并在 if 语句中使用它们。根据复选框,特定工作表将被删除或隐藏。

有没有更快的方法来执行这个?

这是脚本:

        function template() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var campaigninfosheet = ss.getSheetByName('Campaign Info');
    
      var spreadsheettemplateId = "INSERT SPREADSHEET ID";
      var spreadsheettemplate = DriveApp.getFileById(spreadsheettemplateId);
      var spreadsheetcopy = spreadsheettemplate.makeCopy();
      var spreadsheetcopyID = spreadsheetcopy.getId();
      var sheetcopy = SpreadsheetApp.openById(spreadsheetcopyID);
      var fileName = sheetcopy.getName();
    
      var awarenesscheckbox = campaigninfosheet.getRange("A2:B2").getValues()
      var videoviewscheckbox = campaigninfosheet.getRange("A3:B3").getValues()
      var engagementscheckbox = campaigninfosheet.getRange("A4:B4").getValues()
      var followerscheckbox = campaigninfosheet.getRange("A5:B5").getValues() 
      var trafficcheckbox = campaigninfosheet.getRange("A6:B6").getValues()
      var appinstallscheckbox = campaigninfosheet.getRange("A7:B7").getValues()
      var leadgenerationcheckbox = campaigninfosheet.getRange("A8:B8").getValues()
      var conversionscheckbox = campaigninfosheet.getRange("A9:B9").getValues()
    
      var metaplatform = campaigninfosheet.getRange("C2:D2").getValues();
      var snapplatform = campaigninfosheet.getRange("C3:D3").getValues();
      var tiktokplatform = campaigninfosheet.getRange("C4:D4").getValues();
      var twitterplatform = campaigninfosheet.getRange("C5:D5").getValues();
      var youtubeplatform = campaigninfosheet.getRange("C6:D6").getValues();
      var googleplatform = campaigninfosheet.getRange("C7:D7").getValues();
      var linkedinplatform = campaigninfosheet.getRange("C8:D8").getValues();
      var programmaticplatform = campaigninfosheet.getRange("C9:D9").getValues(); 
    
    
    
          for (var i = 0; i < awarenesscheckbox.length; i++) {
        
            var metaawarenesscsheet = sheetcopy.getSheetByName('Meta Awareness Campaign');
            var metaawarenessassheet = sheetcopy.getSheetByName('Meta Awareness Ad Set');
            var fbawarenessassheet = sheetcopy.getSheetByName('FB Awareness Ad Set')
            var igawarenessassheet = sheetcopy.getSheetByName('IG Awareness Ad Set')
            var snapchatawarenesscsheet = sheetcopy.getSheetByName('Snapchat Awareness Campaign');
            var snapchatawarenessassheet = sheetcopy.getSheetByName('Snapchat Awareness Ad Set');
            var tiktokawarenesscsheet = sheetcopy.getSheetByName('TikTok Awareness Campaign');
            var tiktokawarenessassheet = sheetcopy.getSheetByName('TikTok Awareness Ad Set');
            var twitterawarenesscsheet = sheetcopy.getSheetByName('Twitter Awareness Campaign');
            var twitterawarenessassheet = sheetcopy.getSheetByName('Twitter Awareness Ad Set');
            var youtubeawarenesscsheet = sheetcopy.getSheetByName('Youtube Awareness Campaign');
            var youtubeawarenessassheet = sheetcopy.getSheetByName('Youtube Awareness Ad Set');
            var googleawarenesscsheet = sheetcopy.getSheetByName('Google Awareness Campaign');
            var googleawarenessassheet = sheetcopy.getSheetByName('Google Awareness Ad Set');
            var linkedinawarenesscsheet = sheetcopy.getSheetByName('LinkedIn Awareness Campaign');
            var linkedinawarenessassheet = sheetcopy.getSheetByName('LinkedIn Awareness Ad Set');
            var programmaticawarenesscsheet = sheetcopy.getSheetByName('Programmatic Awareness Campaign');
            var programmaticawarenessassheet = sheetcopy.getSheetByName('Programmatic Awareness Ad Set');
            var awarenesssheets = [metaawarenesscsheet, metaawarenessassheet, fbawarenessassheet, igawarenessassheet, snapchatawarenesscsheet, snapchatawarenessassheet, tiktokawarenesscsheet, tiktokawarenessassheet, twitterawarenesscsheet, twitterawarenessassheet, youtubeawarenesscsheet, youtubeawarenessassheet, googleawarenesscsheet, googleawarenessassheet, linkedinawarenesscsheet, linkedinawarenessassheet, programmaticawarenesscsheet, programmaticawarenessassheet]
        
            if (awarenesscheckbox[i][0] === "N") {
        
              awarenesssheets.forEach(asheet => sheetcopy.deleteSheet(asheet))
            }
        
            else if (awarenesscheckbox[i][0] === "Y") {
              for (var i = 0; i < metaplatform.length; i++) {
                if (metaplatform[i][0] === "Y") {
                  [metaawarenesscsheet, metaawarenessassheet, fbawarenessassheet, igawarenessassheet].forEach(metaasheet => metaasheet.hideSheet())
                }
                else {
                  [metaawarenesscsheet, metaawarenessassheet, fbawarenessassheet, igawarenessassheet].forEach(metaasheet => sheetcopy.deleteSheet(metaasheet))
                }
              }
 for (var i = 0; i < snapplatform.length; i++) {
        if (snapplatform[i][0] === "Y") {

          [snapchatawarenesscsheet, snapchatawarenessassheet].forEach(snapasheet => snapasheet.hideSheet())
        }
        else if (snapplatform[i][0] === "N") {
          [snapchatawarenesscsheet, snapchatawarenessassheet].forEach(snapasheet => sheetcopy.deleteSheet(snapasheet))
        }
      }
      for (var i = 0; i < tiktokplatform.length; i++) {
        if (tiktokplatform[i][0] === "Y") {

          [tiktokawarenesscsheet, tiktokawarenessassheet].forEach(tiktokasheet => tiktokasheet.hideSheet())
        }
        else {
          [tiktokawarenesscsheet, tiktokawarenessassheet].forEach(tiktokasheet => sheetcopy.deleteSheet(tiktokasheet))
        }
      }

      for (var i = 0; i < twitterplatform.length; i++) {
        if (twitterplatform[i][0] === "Y") {

          [twitterawarenesscsheet, twitterawarenessassheet].forEach(twitterasheet => twitterasheet.hideSheet())
        }
        else {
          [twitterawarenesscsheet, twitterawarenessassheet].forEach(twitterasheet => sheetcopy.deleteSheet(twitterasheet))
        }
      }

      for (var i = 0; i < youtubeplatform.length; i++) {
        if (youtubeplatform[i][0] === "Y") {

          [youtubeawarenesscsheet, youtubeawarenessassheet].forEach(youtubeasheet => youtubeasheet.hideSheet())
        }
        else {
          [youtubeawarenesscsheet, youtubeawarenessassheet].forEach(youtubeasheet => sheetcopy.deleteSheet(youtubeasheet))
        }
      }

      for (var i = 0; i < googleplatform.length; i++) {
        if (googleplatform[i][0] === "Y") {

          [googleawarenesscsheet, googleawarenessassheet].forEach(googleasheet => googleasheet.hideSheet())
        }
        else {
          [googleawarenesscsheet, googleawarenessassheet].forEach(googleasheet => sheetcopy.deleteSheet(googleasheet))
        }
      }

      for (var i = 0; i < linkedinplatform.length; i++) {
        if (linkedinplatform[i][0] === "Y") {

          [linkedinawarenesscsheet, linkedinawarenessassheet].forEach(linkedinasheet => linkedinasheet.hideSheet())
        }
        else {
          [linkedinawarenesscsheet, linkedinawarenessassheet].forEach(linkedinasheet => sheetcopy.deleteSheet(linkedinasheet))
        }
      }

      for (var i = 0; i < programmaticplatform.length; i++) {
        if (programmaticplatform[i][0] === "Y") {

          [programmaticawarenesscsheet, programmaticawarenessassheet].forEach(programmaticasheet => programmaticasheet.hideSheet())
        }
        else {
          [programmaticawarenesscsheet, programmaticawarenessassheet].forEach(programmaticasheet => sheetcopy.deleteSheet(programmaticasheet))
        }
      }
    }
  }
        }
google-apps-script
1个回答
0
投票

试试这个:

function myFunction() {

  const NewSpreadsheetTitle = `New Spreadsheet Title`

  //

  const MASTER = SpreadsheetApp.getActiveSpreadsheet()

  const SHEETS = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  const INFOSHEET = MASTER.getSheetByName(`Campaign Info`)

  //

  const PLATFORMS = INFOSHEET.getRange(`C2:D9`)
                             .getValues()
                             .filter(Row => Row[0] === `Y`)
                             .flatMap(Row => Row[1])

  const OBJECTIVES = INFOSHEET.getRange(`A2:B9`)
                              .getValues()
                              .filter(Row => Row[0] === `Y`)
                              .flatMap(Row => Row[1])

  //

  const COPY = SpreadsheetApp.create(NewSpreadsheetTitle)

  INFOSHEET.copyTo(COPY).setName(`Campaign Info`)
  MASTER.getSheetByName(`Overall`).copyTo(COPY).setName(`Overall`)
  
  PLATFORMS.forEach(Platform => {
    SHEETS.filter(Sheet => Sheet.getName().includes(Platform))
          .forEach(Sheet => {
            if (Sheet.getName() === Platform) Sheet.copyTo(COPY).setName(Sheet.getName())
            if (OBJECTIVES.some(Objective => Sheet.getName().includes(Objective))) Sheet.copyTo(COPY).hideSheet().setName(Sheet.getName())
          })
  })
                
}

评论:

function myFunctionCommented() {

  // Title of New Spreadsheet being created below.
  const NewSpreadsheetTitle = `New Spreadsheet Title`


  const MASTER = SpreadsheetApp.getActiveSpreadsheet()

  // Creates an array of all Sheets in Spreadsheet.
  const SHEETS = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  const INFOSHEET = MASTER.getSheetByName(`Campaign Info`)

  
  // With the Range of `C2:D9`..
  const PLATFORMS = INFOSHEET.getRange(`C2:D9`)
                             // Get values..
                             .getValues()
                             // Keep only checked boxes..
                             .filter(Row => Row[0] === `Y`)
                             // And create an array of only the platforms.
                             .flatMap(Row => Row[1])

  const OBJECTIVES = INFOSHEET.getRange(`A2:B9`)
                              .getValues()
                              .filter(Row => Row[0] === `Y`)
                              .flatMap(Row => Row[1])

  // Create a new spreadsheet..
  const COPY = SpreadsheetApp.create(NewSpreadsheetTitle)

  // and copy over Campaign Info and Overall.
  INFOSHEET.copyTo(COPY).setName(`Campaign Info`)
  MASTER.getSheetByName(`Overall`).copyTo(COPY).setName(`Overall`)
  
  // For each platform:
  PLATFORMS.forEach(Platform => {
    // Get all sheets that include the current platform in their name.
    SHEETS.filter(Sheet => Sheet.getName().includes(Platform))
          // For each of these filtered sheets:
          .forEach(Sheet => {
            // If the sheet's name is the platform, copy it over.
            if (Sheet.getName() === Platform) Sheet.copyTo(COPY).setName(Sheet.getName())
            // If the sheet's name is the platform, copy it over but hide it.
            if (OBJECTIVES.some(Objective => Sheet.getName().includes(Objective))) Sheet.copyTo(COPY).hideSheet().setName(Sheet.getName())
          })
  })
                
}

尽管如此,由于纸张及其内容的数量,它运行得相当慢。

我建议创建一个新文件夹,并将您的模板表按平台分离到它们自己的电子表格中。然后,您可以让您的“主”表仅包含广告系列信息和总体表以及 Apps 脚本代码。

分页法:

const MASTERS = {

  Meta: `Spreadsheet ID Here`,
  Snapchat: `Spreadsheet ID Here`,
  TikTok: `Spreadsheet ID Here`,
  // etc
}

function VersionTwo() {

  const NewSpreadsheetTitle = `New Spreadsheet Title`

  //

  const MASTER = SpreadsheetApp.getActiveSpreadsheet()
  const INFOSHEET = MASTER.getSheetByName(`Campaign Info`)
  const OVERALLSHEET = MASTER.getSheetByName(`Overall`)

  //

  const PLATFORMS = INFOSHEET.getRange(`C2:D9`)
                             .getValues()
                             .filter(Row => Row[0] === `Y`)
                             .flatMap(Row => Row[1])

  const OBJECTIVES = INFOSHEET.getRange(`A2:B9`)
                              .getValues()
                              .filter(Row => Row[0] === `Y`)
                              .flatMap(Row => Row[1])

  //

  const CLONE = SpreadsheetApp.create(NewSpreadsheetTitle)
  INFOSHEET.copyTo(COPY).setName(`Campaign Info`)
  OVERALLSHEET.copyTo(COPY).setName(`Overall`)
  
  PLATFORMS.forEach(Platform => {
    SpreadsheetApp.openById(MASTERS[Platform])
                  .getSheets()
                  .filter(Sheet => Sheet.getName().includes(Platform))
                  .forEach(Sheet => {
                    if (Sheet.getName() === Platform) Sheet.copyTo(CLONE).setName(Sheet.getName())
                    if (OBJECTIVES.some(Objective => Sheet.getName().includes(Objective))) Sheet.copyTo(CLONE).hideSheet().setName(Sheet.getName())
                  })
  })

}
© www.soinside.com 2019 - 2024. All rights reserved.