根据Google电子表格中的单元格值自动隐藏列

时间:2017-05-06 14:15:04

标签: google-sheets

我在工作表中有太多列,并且要隐藏很多列,但在执行脚本时,它会运行一半并停止说达到最大时间。

当我再次尝试执行时,它停在我之前停止的位置。所以我想进行一些自定义,如果列已经被隐藏,可以跳过该列并处理其他列。

有没有办法做到这一点。

以下是我使用的代码:

function hideColumns() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getSheetByName('ANALYTIC');
    var data = sh.getRange('6:6').getValues();
    var numCols = sh.getMaxColumns();
    var numRows = sh.getMaxRows();

    for(var i = 0; i <= numCols; i++){
        if(data[0][i] == ""){
            sh.hideColumns(i+1);
        } else {
            sh.unhideColumn(sh.getRange(1, i+1, numRows, 1));
        }
    }
}

请帮帮我。

2 个答案:

答案 0 :(得分:1)

您可以使用documentProperties在执行结束前存储最后一列。为了防止运行突然停止,您在5分钟过早停止运行(执行将在6分钟标记处终止)标记并将列号存储在documentProperty中。您还会显示一条警告,要求您重新运行该脚本。

然后在下次运行时检索列号并从那里开始。如果程序通过完整循环,则删除所述属性。因此,如果下次重新运行脚本,则从零开始。

以下是相同

的代码
function hideColumns() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getSheetByName('ANALYTIC');
    var data = sh.getRange('6:6').getValues();
    var numCols = sh.getMaxColumns();
    var numRows = sh.getMaxRows();
    var docProp = PropertiesService.getDocumentProperties()
    var startCol = Number(docProp.getProperty("startCol"))    //if there is no propert called startCol will return Null, Number(Null) = 0
    Logger.log(startCol)
    var startTime = new Date().getTime()    
    var ms5min = 5*60*1000         //5min in millseconds

    for(var i = startCol; i <= numCols; i++){
        if(data[0][i] == ""){
            sh.hideColumns(i+1);
        } else {
            sh.unhideColumn(sh.getRange(1, i+1, numRows, 1));
        }
      var curTime = new Date().getTime()
      var elasped = curTime-startTime

      if (elasped >= ms5min){
        docProp.setProperty("startCol", i)
        SpreadsheetApp.getUi().alert("Please restart Run, exceeded 5min mark")
        return
      }
    }
  Logger.log(elasped)
  docProp.deleteAllProperties()
}

答案 1 :(得分:0)

如果您的工作表少于10,000列(PropertiesService限制),您可以使用此脚本:

function hideColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('ANALYTIC');
  var data = sh.getRange('6:6').getValues();
  var documentProperties = PropertiesService.getDocumentProperties()
  var documentPropertiesVals = documentProperties.getProperties();
  var numCols = sh.getMaxColumns();


  for(var i = 0; i < numCols; i++){
    if (!(cPlusInt(i) in documentPropertiesVals)) {
      documentPropertiesVals[cPlusInt(i)] === 'empty';
    }

    if (documentPropertiesVals[cPlusInt(i)] === 'hidden' && data[0][i] == "") continue;
    if (documentPropertiesVals[cPlusInt(i)] === 'unhidden' && data[0][i] != "") continue;

    if(data[0][i] == ""){
      sh.hideColumns(i+1);
      documentProperties.setProperty(cPlusInt(i), 'hidden')
    } else {
      sh.unhideColumn(sh.getRange(1, i+1, 1, 1));
      documentProperties.setProperty(cPlusInt(i), 'unhidden')
    }
  }  
}

function cPlusInt(num) {
  return 'c'+num.toString()
}

你起初你可能需要运行这几次(许多写操作到PropertiesService可能会很迟钝)但是后来它会肆无忌惮地&#34;快速(每列0.1秒)。

使用@Jack Brown的想法更好地回答

可以单独保存到PropertiesService - 你需要加入@Jack Brown answer的时间限制,这样:

function hideColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('ANALYTIC');
  var data = sh.getRange('6:6').getValues();
  var documentProperties = PropertiesService.getDocumentProperties()
  var documentPropertiesVals = documentProperties.getProperties();
  var numCols = sh.getMaxColumns();

  var startTime = new Date().getTime()    
  var ms5min = 5*60*1000 //5min in millseconds      

  for(var i = 0; i < numCols; i++){
    if (!(cPlusInt(i) in documentPropertiesVals)) {
      documentPropertiesVals[cPlusInt(i)] === 'empty';
    }

    if (documentPropertiesVals[cPlusInt(i)] === 'hidden' && data[0][i] == "") continue;
    if (documentPropertiesVals[cPlusInt(i)] === 'unhidden' && data[0][i] != "") continue;

    if(data[0][i] == ""){
      sh.hideColumns(i+1);
      documentPropertiesVals[cPlusInt(i)] = 'hidden'
    } else {
      sh.unhideColumn(sh.getRange(1, i+1, 1, 1));
      documentPropertiesVals[cPlusInt(i)] = 'unhidden'
    }

    var curTime = new Date().getTime()
    var elapsed = curTime-startTime
    if (elapsed >= ms5min){
      break;      
    }    
  }      

  documentProperties.setProperties(documentPropertiesVals)

  if (elapsed >= ms5min){
    SpreadsheetApp.getUi().alert("Please restart Run, exceeded 5min mark")
  }
}

cPlusInt功能说明

cPlusInt是必要的,因为Google PropertiesService存在奇怪的问题。从PropertiesService获取的对象在整数键处返回undefined。要查看问题,请使用以下代码:

function test() {
  var obj = {};
  for (var i=0; i<10; i++) {
    obj[i.toString()] = 'aa' + i.toString();    
  }

  var documentProperties = PropertiesService.getScriptProperties();
  documentProperties.deleteAllProperties();
  documentProperties.setProperties(obj);
  obj = documentProperties.getProperties();

  Logger.log(obj)
  for (var i in obj) {
    Logger.log('%s %s %s', i, obj[i], i === '1');
  }
}