Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google sheets Google Sheets脚本忽略或包含特定的工作表_Google Sheets - Fatal编程技术网

Google sheets Google Sheets脚本忽略或包含特定的工作表

Google sheets Google Sheets脚本忽略或包含特定的工作表,google-sheets,Google Sheets,我得到这个错误:TypeError:无法调用null的方法“getName”。我使用脚本将活动工作表的公式替换为单元格值。但是,我不想意外地在几个工作表上运行此操作,因此我希望能够排除或仅包括特定的工作表。我一直在关注另一篇文章,并提出了这一点,现在我有一个错误: function freezeValues() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheets = ss.getSheets(); //loop t

我得到这个错误:TypeError:无法调用null的方法“getName”。我使用脚本将活动工作表的公式替换为单元格值。但是,我不想意外地在几个工作表上运行此操作,因此我希望能够排除或仅包括特定的工作表。我一直在关注另一篇文章,并提出了这一点,现在我有一个错误:

function freezeValues() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  //loop through all sheets and get name to see if it includes specific string
  for (i = 0; i < sheets.length; i++) {
    var sheet = ss.getSheetByName(sheets[i]);
    var name = sheet.getName();
    if (name.includes("String_00")) {
      //get active sheet and replace range with values
      var sheetActive = ss.getActiveSheet();  
      var range = sheetActive.getRange("A1:Z50");
      range.copyTo(range, {contentsOnly: true});
    } else {
      continue;
      //skip over all those that don't meet the condition
    }
  }
}
函数冻结值(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheets=ss.getSheets();
//循环浏览所有工作表并获取名称,查看它是否包含特定的字符串
对于(i=0;i
更新:

试一试:

function freezeValues() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  //loop through all sheets and get name to see if it includes specific string
  for (i = 0; i < sheets.length; i++) {
    //var sheet = ss.getSheetByName(sheets[i]);
    var name = sheets[i].getName().toString();
    if (name.indexOf("String_00") > -1) {
      //get active sheet and replace range with values
      //var sheetActive = ss.getActiveSheet();  
      var range = sheets.getRange("A1:Z50");
      range.copyTo(range, {contentsOnly: true});
    } else {
      continue;
      //skip over all those that don't meet the condition
    }
  }
}
函数冻结值(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheets=ss.getSheets();
//循环浏览所有工作表并获取名称,查看它是否包含特定的字符串
对于(i=0;i-1){
//获取活动图纸并用值替换范围
//var sheetActive=ss.getActiveSheet();
var范围=sheets.getRange(“A1:Z50”);
copyTo(范围,{contentsOnly:true});
}否则{
继续;
//跳过所有不符合条件的
}
}
}

但现在它什么也做不了。使用.include时出错,因此我转到.indexOf()>-1。不会像预期的那样冻结任何工作表的数据,无论其名称如何。

我为此想出了两种解决方案,某种程度上是从绘图板开始的。创建一个数组,一种黑名单,然后如果工作表名称包含黑名单中的任何项目,则返回,不执行替换。第二种解决方案在图纸名称中搜索图案,然后继续替换。两者都完成了我想做的事情。我认为我发现的代码有点错误,对于我正在做的事情来说有点复杂。我不需要遍历所有的工作表名称,只需对照给定的变量检查工作表名称。不管怎样,它们在这里:

这将创建不可编辑页面的数组黑名单:

function freezeValues() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4'];
  var sheetActive = ss.getActiveSheet();  
  if (sheets.indexOf(sheetActive.getName()) > -1) return;
  var range = sheetActive.getRange("A1:Z50");
    range.copyTo(range, {contentsOnly: true});
}
在继续替换之前,此选项仅搜索图纸名称中的特定文本

function freezeValues() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetActive = ss.getActiveSheet();
  var name = sheetActive.getName()
  if (name.indexOf("String_00") > -1) {
    var range = sheetActive.getRange("A1:Z50");
      range.copyTo(range, {contentsOnly: true});
  }
}
我相信有一种方法可以使用工作表索引值,所以如果您想跳过前4张工作表,您也可以这样做,因此它根本不需要调用名称

更新

function freezeValues2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetActive = ss.getActiveSheet();
  if (sheetActive.getIndex() > 4) {
    var range = sheetActive.getRange("A1:Z50");
      range.copyTo(range, {contentsOnly: true});
  }
}

清除了错误,但是我得到了另一个错误,“TypeError:找不到对象Sheetname中的函数includes”。通过谷歌搜索,我发现已建议将includes替换为indexOf()>-1,并将名称转换为字符串。所以我试过了,它似乎允许冻结所有的工作表,并且不会停止不包含该字符串的工作表…我使用getActiveSheet,所以它只冻结我在UI上拉出来的工作表。我不认为我在其他任何地方需要ActiveSheet,只需要ActiveSpreadsheet,它是整个文档,而不是单个选项卡,对吗?是的。如果(sheetActive.getIndex()>4)
或任何要忽略的范围,它看起来像
。这将替换sheets数组或name变量,并替换if行。