需要帮助调整脚本以适应一周中的多天

时间:2016-12-19 06:37:55

标签: google-sheets

我在另一篇文章中找到了这段代码。对于Google表格,基本上它会复制"状态"中的颜色格式。 "星期一"中匹配单元格中的制表符和颜色。



function colorCodeRevised() {
  var ss=SpreadsheetApp.getActiveSpreadsheet()
  var lr=ss.getSheetByName("Monday").getLastRow() // get last row of sheet1
  var lc=ss.getSheetByName("Monday").getLastColumn() //get last column of sheet1
  var lr1=ss.getSheetByName("Status").getLastRow() // get last row of sheet2
  var lc1=ss.getSheetByName("Status").getLastColumn() ////get last column of sheet2
  var sv=ss.getSheetByName("Monday").getRange(5,2,1,lc-15).getValues() // get vehicles. startrow,startcolumn,numrows to return,numcolumns to return
  var sn=ss.getSheetByName("Monday").getRange(6,1,lr-5,1).getValues() // get names
  var s1=ss.getSheetByName("Status").getRange(2,1,lr1-2,lc1)//exclude legend. squarebackets is sheet numbermm 0=1, 1=2
  var rng1=s1.getValues() // get sheet2 data
  var rng2=s1.getBackgrounds() // get background colors of dheet2 data

var test= sn.length
var test1= sv.length
var test2=rng1[0].length

var col=1 //column for vehicles on sheet1
   for(var m=0;m<sv[0].length;m++){ //for each vehicle
      col=col+1 //add one to vehicle column
  for(var n=0;n<sn.length;n++){ //for each name
  for(var i=0;i<rng1.length;i++){ //loop sheet2 data
  for(var j=0;j<rng1[0].length;j++){
  
    if(rng1[i][j].indexOf(sv[0][m])>-1 && rng1[i][j].indexOf(sn[n][0])>-1){ //if sheet2 data cell contains vehicle and name
       var c=ss.getSheetByName("Monday").getRange(n+6, col).setBackground(rng2[i][j]) //set color of vehicle and name on sheet1
  }}}}}
}
&#13;
&#13;
&#13; 我有一个非常类似的电子表格,但我正在努力使它不仅运行周一,而是一周的所有日子。我可以制作6个相同的脚本,但我觉得每次需要进行更改时,工作表运行7个脚本会太费力。我想要着色的单元格与星期一完全相同的图案/顺序。例如,如果周一的C6为红色,则周二的C6也应为红色。任何人都可以帮助我让这个脚本从星期二到星期日和星期一一样使用相同的单元格,而不需要花费7倍的时间来运行吗?

1 个答案:

答案 0 :(得分:0)

针对您的具体问题;我认为您真正需要做的就是添加一个循环,其中包含您要修改的工作表列表。从那里,你可以把一切都变成一个变量。该解决方案最后显示。

在我让你离开之前,我想建议一些改变^ _ ^

获取该代码示例并使其适用于您的工作表非常棒!我喜欢这个概念,并且通过组织所有这些数据,我得到了你的位置。我做了一些改变(我认为)可能会帮助你。

这些更改大多是为了将逻辑从脚本中移出并进入工作表。在表格中使用公式的惊人之处在于它们非常适合Google优化。如果您可以将您正在寻找的内容分解为Google已实施的代码段,那么事情会变得更快。

建议的更改:

  1. 状态页面
    1. 已更改为用户和角色的矩阵。某人扮演的每个角色都有一个x。将来,您可以根据表单输入填充此矩阵,如果这是您的目的。
    2. 将A1设置为包含在日期页面上正确为表格着色所需的所有条件格式。
    3. 手动着色角色标题,因为我不想重新执行A1中的所有条件格式,并且分层条件格式不是一件事。
  2. 日页
    1. 颜色表中的每个单元格现在都有一个公式,根据该行中的用户是否在状态页面上具有该角色的x,将该值设置为该角色。
    2. 根据这些单元格中的文字,它们被着色为具有类别&#39;为文本和背景选择的颜色。
  3. 剧本
    1. 可以在顶部配置要更改的页面列表以及具有格式的单元格的位置。
      • 我希望我可以在脚本中创建格式规则,但该功能尚不可用。希望它能在Google进入this issue
      • 时实施
    2. 使用格式
    3. 抓取单元格
    4. 遍历每个页面
    5. 获取颜色表
    6. 将公式(在脚本中)和格式复制到表格
    7. 最后,它在顶部添加了一个自定义菜单,可用于调用名为&#34;脚本工具&#34;。
    8. 的函数。
  4. 优点

    • 您只需要将公式和格式复制到每张工作表
    • 当状态发生变化时,它们会立即反映在正确的页面上

    替代解决方案

    link to my sheet

    link to make an editable copy in your drive

    /* Loops through all whitelisted sheets and applies a pre-defined format to the table on each.
     * 
     * Michael Kenworthy 12/21/16
    */
    
    //Set-up variables
    var whitelist = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
    var colorKeySheet = "Status"
    var colorKeyFormatCell = "A1"
    var colorTableRange = "B6:M"
    
    var doc = SpreadsheetApp.getActive();
    var ui = SpreadsheetApp.getUi();
    
    function formatting() {
      statusSheet = doc.getSheetByName(colorKeySheet);
      formatCell = statusSheet.getRange(colorKeyFormatCell);
    
      for(var i=0; i<whitelist.length; i++){
        sheet = doc.getSheetByName(whitelist[i])
        colorTable = sheet.getRange(colorTableRange);
    
        cell = colorTable.getCell(1, 1)
        cell.setFormula('if(not(isblank(INDIRECT("Status!R"&MATCH($A6,Status!$A:$A,0)&"C"&MATCH(B$5,Status!$1:$1,0),false))),B$5,)')
        formatCell.copyTo(cell, {formatOnly: true});
    
        cell.copyTo(colorTable)
      }
    }
    
    function onLoad(){
      // Or DocumentApp or FormApp.
      ui.createMenu('Sheet tools')
          .addItem('Apply formatting to day sheets', 'formatting')
          .addToUi();
    }
    

    解决原始问题

    var whitelist = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
    
    function colorCodeRevised() {
      var ss=SpreadsheetApp.getActiveSpreadsheet()
    
    
      var lr1=ss.getSheetByName("Status").getLastRow() // get last row of sheet2
      var lc1=ss.getSheetByName("Status").getLastColumn() ////get last column of sheet2
    
      var s1=ss.getSheetByName("Status").getRange(2,1,lr1-2,lc1)//exclude legend. squarebackets is sheet numbermm 0=1, 1=2
      var rng1=s1.getValues() // get sheet2 data
      var rng2=s1.getBackgrounds() // get background colors of dheet2 data
    
      for(var sheetNum=0;sheetNum<whitelist.length;sheetNum++){
        var lr=ss.getSheetByName(whiltelist[sheetNum]).getLastRow() // get last row of sheet1
        var lc=ss.getSheetByName(whiltelist[sheetNum]).getLastColumn() //get last column of sheet1
        var sv=ss.getSheetByName(whiltelist[sheetNum]).getRange(5,2,1,lc-15).getValues() // get vehicles. startrow,startcolumn,numrows to return,numcolumns to return
        var sn=ss.getSheetByName(whiltelist[sheetNum]).getRange(6,1,lr-5,1).getValues() // get names
    
        var col=1 //column for vehicles on sheet1
        for(var m=0;m<sv[0].length;m++){ //for each vehicle
          col=col+1 //add one to vehicle column
          for(var n=0;n<sn.length;n++){ //for each name
            for(var i=0;i<rng1.length;i++){ //loop sheet2 data
              for(var j=0;j<rng1[0].length;j++){
                if(rng1[i][j].indexOf(sv[0][m])>-1 && rng1[i][j].indexOf(sn[n][0])>-1){ //if sheet2 data cell contains vehicle and name
                  var c=ss.getSheetByName(whiltelist[sheetNum]).getRange(n+6, col).setBackground(rng2[i][j]) //set color of vehicle and name on sheet1
                }
              }
            }
          }
        }
      }
    }