Google sheets 谷歌工作表-在上一张工作表的相同单元格中获取值

Google sheets 谷歌工作表-在上一张工作表的相同单元格中获取值,google-sheets,Google Sheets,我正在创建一个训练电子表格,每周跟踪我的表现,每张表格涵盖一周的训练。每一张纸(除了第一张)都是前一张纸的副本,我想从前一张纸中继承一些值;例如,前一周的练习重复次数 我已经阅读了一些API,但似乎找不到一个函数来选择调用该函数的当前工作表。如果它存在,我可以得到索引并从中减去以得到上一张表,然后从给定的行和列中获取一个值。然而,我能找到的最接近的东西是访问“活动”工作表——似乎是使用setActiveSheet()函数设置的。但我不知道如何在一个脚本中使用它,该脚本用于多个不同的单元格 我是否

我正在创建一个训练电子表格,每周跟踪我的表现,每张表格涵盖一周的训练。每一张纸(除了第一张)都是前一张纸的副本,我想从前一张纸中继承一些值;例如,前一周的练习重复次数

我已经阅读了一些API,但似乎找不到一个函数来选择调用该函数的当前工作表。如果它存在,我可以得到索引并从中减去以得到上一张表,然后从给定的行和列中获取一个值。然而,我能找到的最接近的东西是访问“活动”工作表——似乎是使用setActiveSheet()函数设置的。但我不知道如何在一个脚本中使用它,该脚本用于多个不同的单元格

我是否遗漏了一些信息,或者是否有更好的方法获取当前所选工作表的信息?你能提供的任何帮助都会很有帮助。谢谢大家!

[编辑]我的电子表格位于此处:


另外,我将在下面发布脚本。

要获取当前工作表,可以使用.getActiveSheet()然后使用.getIndex()。然后从那里减去。注意.getIndex()是1索引的。所以第一张纸的索引是1。如果要将其与.getSheets()结合使用(索引为零),则必须执行-2才能访问上一张工作表。如果需要,您可能需要构建一些错误处理(如果您已经在第一张工作表上)。例如:


我不知道你是否还需要它们,但我制作了这个脚本(我爸爸需要它)


我刚刚以Sheets add-on的形式提交了它,让我们看看它是否会很快出现

如果仍然对此感兴趣,下面是我的(通用解决方案):

/**
*根据索引获取给定工作表的名称
*@param{number}索引
*如果为正:参见相对偏移;如果为负数:前一张纸(-1表示前一张纸),否则(默认):当前张纸
*@param{boolean}相对偏移
*如果为TRUE,则正索引表示相对于当前图纸选项卡,否则(FALSE=默认值)表示绝对图纸索引(第一个为1)
*@返回相关工作表的名称
*@customfunction
*/
函数getSheetName(索引,相对偏移){
var ss=SpreadsheetApp.getActive();
var curSheet=ss.getActiveSheet();
var curSheetIndex=curSheet.getIndex();
var getSheetIndex=curSheetIndex-1;
如果(索引>0&!相对偏移){
getSheetIndex=index-1;
}否则,如果(索引>0){
getSheetIndex=getSheetIndex+索引;
}else if(索引<0){
getSheetIndex=curSheetIndex+索引;
}
如果(getSheetIndex<0){
返回false;
}
var getSheet=ss.getSheets()[getSheetIndex];
//对于调试:
//返回(“curSheetIndex:+curSheetIndex+”;索引:+index+;getSheetIndex:+getSheetIndex+”;“+getSheet.getName());
返回getSheet.getName();

}
威廉的答案有效。但是,当将单元格位置作为函数参数(例如previousCell(“B$1”)的字符串传递时,当拖动和复制单元格时,B$1将保持不变。为了解决这个问题,我创建了另一个具有相对列位置的函数,因此它将始终访问上一页中的相同行和相对列:

function previousCell(relCol) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var curSheet = ss.getActiveSheet();
  if (curSheet < 2)
    return "There is no previous sheet";
  var preSheet = ss.getSheets()[curSheet.getIndex() - 2];
  var curCel = curSheet.getActiveCell();
  return preSheet.getRange(curCel.getRow(), curCel.getColumn() + relCol).getValue();
}
function-previousCell(relCol){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var curSheet=ss.getActiveSheet();
如果(光标<2)
返回“没有上一页”;
var pressheet=ss.getSheets()[curSheet.getIndex()-2];
var curCel=curSheet.getActiveCell();
返回pressheet.getRange(curCel.getRow()、curCel.getColumn()+relCol.getValue();
}

因此,它将调用函数:previousCell(2),它将访问上一页中具有相同行和2列的单元格。

嘿,JPV,感谢您的响应。我尝试了与上面的函数类似的方法,但它总是返回电子表格第一页中的值。起初我以为getActiveSheet()只会引用当前可见的工作表,但现在我不确定。大家好,我刚刚测试了我的代码,它似乎很好地记录了上一个工作表。也许你的代码中有什么东西对所描述的行为负责?是否可以在此处共享您的电子表格或代码?我尝试了与您发布的代码类似的代码,但将其扩展为行/列,使用给定的行/列从上一张表中获取范围,并获取值,然后返回。同样,它在第二张图纸上工作正常,但在复制图纸后,它再次引用第一张图纸中的值,而不是第二张图纸中的值。复制工作表是否有一些不可靠的地方可能是其中的一个因素?另外,如果您查看工作表,请查看getCurrentSheetIndex()函数,并注意无论我在哪张工作表上使用它,它总是返回
1
,这意味着我需要做一些事情来激活某些工作表。由于我的编码限制,cellLocation参数不会直接寻址上一个工作表中的目标单元格。如果您的目标是A1,则在上一个工作表中,第一个解决方法是在公式中加引号(=previousCell(“A1”))第二种解决方法是在其他单元格中设置指针(适用于递归),即=previousCell(B1),这将读取当前工作表中B1的值,如果当前工作表中B1为空,则返回错误;因此,将上一页的目标单元格(“A1”,无需报价)放在B1中
function previousCell(cellLocation) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var curSheet = ss.getActiveSheet();
  var curSheetIndex = curSheet.getIndex();
  var preSheetIndex = curSheetIndex - 2;
  var preSheet = ss.getSheets()[preSheetIndex];
  var targetCell = preSheet.getRange(cellLocation);
  var value = targetCell.getValue();
  if (curSheetIndex == 1){
  return "There is no previous sheet" ;
  }

  else    
  return value;
}
function previousCell(relCol) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var curSheet = ss.getActiveSheet();
  if (curSheet < 2)
    return "There is no previous sheet";
  var preSheet = ss.getSheets()[curSheet.getIndex() - 2];
  var curCel = curSheet.getActiveCell();
  return preSheet.getRange(curCel.getRow(), curCel.getColumn() + relCol).getValue();
}