【问题标题】:Unable to activate a sheet by name无法按名称激活工作表
【发布时间】:2013-09-04 11:09:35
【问题描述】:

我正在尝试根据当前月份在打开电子表格时激活月度表。

问题出现在脚本的末尾,当它无法选择工作表时。似乎getSheetByName() 获得了null 值,setActiveSheet() 不接受该值。

function selectmonth(){
  var now= new Date();
  var month= now.getMonth()+1;  
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheetname="";

  switch (month){
    case 1:
      sheetname="urtarrila01";  //english=january01
      break;
    case 2:
      sheetname="otsaila02";    //english=february02 and so on...
      break;
    case 3:
      sheetname="martxoa03";
      break;
    case 4:
      sheetname="apirila04";
      break;
    case 5:
      sheetname="maiatza05";
      break;
    case 6:
      sheetname="ekaina06";
      break;
    case 9:
      sheetname="iraila09";
      break;
    case 10:
      etiketaizena="urria10";
      break;
    case 11:
      sheetname="azaroa11";
      break;
    case 12:
      sheetname="abendua12";
      break;      
    default:
      sheetname="LABURPENA-resumen";
  }

 //HERE mysheet gets null value, although the sheet exist, named "sheetname) 
  var mysheet=ss.getSheetByName(sheetname); 
  //AN HERE THE SCRIPT FAILS, ERROR MESSAGE=invalid argument on next line
  ss.setActiveSheet(mysheet);
}

这是最终的有效代码:

enter code here

  function hileHonetan(){
  var now= new Date(); 
  var month= now.getMonth();
  var mysheetname="";
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheetNames= ['urtarrila01', 'otsaila02', 'martxoa03', 'apirila04',  'maiatza05',  'ekaina06', 'ekaina06', 'ekaina06', 'iraila09', 'urria10', 'azaroa11' , 'abendua12']
  mysheetname= sheetNames[month];
  var mysheet=ss.getSheetByName(mysheetname);
  mysheet.activate();

}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您的脚本可以更简单... 像这样尝试:(所有标记为;// can be removed 的行确实可以删除,并且仅用于演示目的)

    function selectmonth(){
      var now= new Date();
      var month = now.getMonth();  
      Logger.log(month);// can be removed
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheetNames = [];// can be removed
      var sheets = ss.getSheets();// can be removed
      for( var n in sheets){;// can be removed
        sheetNames.push(sheets[n].getName());// can be removed
      };// can be removed
      var mysheet = ss.getSheets()[month] 
      ss.setActiveSheet(mysheet);
      Browser.msgBox("this sheet is "+sheetNames[month]);// can be removed
    }
    

    还有“短”版:

    function selectmonth(){
       var now= new Date();
       var month = now.getMonth();  
       var ss = SpreadsheetApp.getActiveSpreadsheet();
       var mysheet = ss.getSheets()[month] 
       ss.setActiveSheet(mysheet);
    }
    

    编辑:如果您真的想按名称获取工作表(以防您不确定工作表顺序),您可以像下面这样实现它(这仍然比您的代码简单得多):

    function selectmonth(){
      var now= new Date();
      var month = now.getMonth();  
      Logger.log(month);
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheetNames = ['Sheet1','Sheet2','Sheet3','Sheet4','Sheet5','Sheet6','Sheet7','Sheet8','Sheet9','Sheet10','Sheet11','Sheet12',];;
      Logger.log(sheetNames)
      var mysheet = ss.getSheetByName(sheetNames[month]);
      ss.setActiveSheet(mysheet);
      Browser.msgBox("this sheet is "+sheetNames[month]);// can be removed
    }
    

    编辑 2: 因为您似乎不断遇到问题,所以让我建议第三个版本,它利用您的 sheetNames 中包含的数字并找到正确的工作表,即使它们没有排序......事情是这样的:

    function selectmonth(){
      var now= new Date();
      var month = now.getMonth();  
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var mysheet;
      var sheets = ss.getSheets();
      for( var n in sheets){
        var index = Number(sheets[n].getName().replace(/[^0-9]/ig,''));
        Logger.log(index);// index is the number included in your sheetName, with that we can get the sheet in the following loop.
        if(index == month+1){mysheet = ss.getSheets()[n] ; break}
      }
      ss.setActiveSheet(mysheet);
      Browser.msgBox("this sheet is "+mysheet.getName());
    }
    

    【讨论】:

    • 所以基本上你建议使用sheed id(一个预定义的整数),而不是工作表名称。我没有尝试这种方式的原因是文件是由另一个人创建的,并且工作表已经重新排序;此外,该文件将是一个可复制 500 次的模板。我不知道是否真的可以强制更改工作表 ID;如果是的话,我会这样做,使用你的代码。我将尝试第二种方法:在列表中排序名称。非常感谢
    • 好吧,我试过了,同样的问题仍然存在:“var mysheet=ss.getSheetByName(sheetNames[month])”返回一个空值,所以 setactivesheet 以后不能工作。我已经记录了以前的值并且没问题。我将尝试使用整数创建列表,“重新排序”工作表 ID。
    • 如果您想完全确定名称,您可以尝试第一个版本并实际看到工作表名称...然后您可以在最后一个版本中使用它,而不会怀疑拼写或不可见空格可能在那里...使用记录器:Logger.log(sheetNames)
    • 查看编辑以获取两全其美的解决方案;-)
    • 对不起,我已经有几天不在了。现在确实有效,当时我正要放弃。非常感谢你。我将使用最终代码进行编辑。
    猜你喜欢
    • 2019-05-10
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2018-08-17
    • 2020-08-24
    相关资源
    最近更新 更多