当前位置: 首页 > 知识库问答 >
问题:

将google电子表格光标移动到打开的当前日期单元格

颜黎昕
2023-03-14

我一直试图在电子表格打开到当前日期时移动它的视图。

这是一个日程安排电子表格,每个月都有一张表格,第一列中列出的日期向下。

我已成功将工作表更改为当月,代码如下:

function gotoCurrentMonth() {
  var monthTabs = [ "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December" ];

  var month = (new Date()).getMonth();  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(monthTabs[month]);
  sheet.activate();
}

将其添加到onOpen函数时,不会出现任何问题。

但是,以下代码仅在通过脚本编辑器手动触发时有效,在gotoCurrentMonth函数之后调用时似乎不会触发。

function gotoCurrentDay() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  //Get current day value from the MATCH spreadsheet function
  //Example of cell value: 73
  var range = sheet.getRange(2, 2).getValue();

  //Go to bottom cell so that when it goes back up to current day, it's at the top of the screen
  sheet.setActiveCell(sheet.getRange(sheet.getLastRow(), 1));
  Logger.log("Select Last Row: " + sheet.getLastRow());

  //Go back up to current day cell
  sheet.setActiveCell(sheet.getRange(range, 1));
  Logger.log("Select Current Day Row: " + range);
}

当电子表格打开时,电子表格将切换到三月工作表,但选定的单元格不会移动。坐在三月名单的顶端。

然后,如果我将光标移回1月1日(就像打开时一样),并在全部加载后手动运行onOpen功能,那么它将正常工作,并正确选择当前日期。

我的onOpen功能:

function onOpen() {
  gotoCurrentMonth();
  gotoCurrentDay();
};

如果手动或通过自动触发器激活onOpen功能,有什么想法可以解释为什么它的行为会有所不同?

共有1个答案

景温书
2023-03-14

尝试将这两个功能组合在一个。。。此代码似乎按照您的预期工作:

function gotoCurrentMonthAndDay() {
  var monthTabs = [ "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December" ];

  var month = (new Date()).getMonth();  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(monthTabs[month]);
  var row = sheet.getRange(2, 2).getValue();
  sheet.setActiveCell(sheet.getRange(sheet.getLastRow(), 1));//gets end of sheet
  SpreadsheetApp.flush();//update sheet
  Utilities.sleep(500);//pause 1/2 sec
  sheet.setActiveCell(sheet.getRange(row, 1));//activate on right date
}

作为任何想要测试的人的奖励,一个小脚本来创建12张并删除它们:

function createSheets(){
  var monthTabs = [ "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December" ];
  for(var n in monthTabs){
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(monthTabs[n]);
    Utilities.sleep(500);
  }
  SpreadsheetApp.getActiveSpreadsheet().deleteSheet(SpreadsheetApp.getActiveSpreadsheet().getSheets()[0])
} 

function deleteSheets(){
  var monthTabs = [ "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November" ];
  for(var n in monthTabs){
    var del = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(monthTabs[n]);
    try{
      SpreadsheetApp.getActiveSpreadsheet().deleteSheet(del);
    Utilities.sleep(500);
    }catch (err){Logger.log(err)};
  }
 SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].setName('Sheet1');
} 

由于您的电子表格公式似乎导致了一些问题,因此这里有一种“纯JavaScript”方法,可以在正确的表格中找到正确的日期。正如他们在电视剧《边缘》中所说,这些是“平行宇宙”或交替现实。。。从电子表格到JavaScript和反向转换并不总是那么容易;)。。。

无论如何,一个简单的函数可以查看cola中的每个单元格,并从日期中获取日期并返回该值,可以编写如下:

function getTodayRow(sheet){
  var colContent = sheet.getRange('A1:A').getValues();
  var today = new Date().getDate();
  var val=1;
  for(var n in colContent){
    if(new Date(colContent[n][0]).getDate() == today){val=Number(n)+1;break}
  }
  return val;// the +1 above is because arrays count from 0 and rows count from 1. (Number() is to avoid having 13+1=131 which is the default behavior unfortunately)
}

它将工作表对象作为参数,并返回一个数字(如果没有找到匹配的日期,则返回1,这样在最坏的情况下,您可以转到工作表的顶部)。

你的主要功能也应该改变,它变成:

function onOpen() { // I decided to call it simply onOpen to use the simple trigger that is sufficient in this case. Note that the user must have edit right for the script to run. 
  var monthTabs = [ "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December" ];

  var month = (new Date()).getMonth();  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(monthTabs[month]);
  var row = getTodayRow(sheet);
  sheet.setActiveCell(sheet.getRange(sheet.getLastRow(), 1));//gets end of sheet
  SpreadsheetApp.flush();//update sheet
  Utilities.sleep(500);//pause 1/2 sec, I saw your comment about timing... In my tests it works with 500 millisecs but adjust to your needs.
  sheet.setActiveCell(sheet.getRange(row, 1));//activate on right date
}
 类似资料:
  • 我目前正在谷歌应用程序中创建一个电子表格,用于记录客户出席情况。电子表格包含12张表格。每张纸代表一年中的一个月,所以第一张纸代表一月,第二张纸代表二月等等。 我正在尝试使用On_Open功能创建一个Google应用程序脚本,根据当前日期自动打开相关工作表。 例如,如果当前日期为2013年2月18日,则电子表格将自动打开,焦点为工作表2(2月)。 我认为我使用电子表格应用程序是正确的。setAct

  • 我有每周更新的谷歌电子表格。它包含多个工作表,每个星期都有不同的名称。 有没有一种方法可以使用google脚本将该电子表格中的所有表格复制到另一个电子表格中?我的主要目标是复制整个电子表格,并让我运行脚本的工作表拥有源表中的所有工作表和数据。如果这个复制过程只复制数据,而不是其他工作表中的公式,那也很好。 提前谢谢! 埃里克

  • 我有一个谷歌表单电子表格。第2行包含日期,例如2020年8月25日、2020年8日26日,跨越多个列。有没有一个脚本我可以运行,使它跳转到包含文档第一次打开时的当前日期的单元格? 我知道您定义了OnOpen()方法,它在打开文档时运行,但是,获取实际工作的代码很困难。 注意:我查看了Google电子表格/文档,在打开时跳转到当前日期单元格,但解决方案不起作用(我假设是因为我的日期都在一行中)。 我

  • 我是一名编码等方面的初学者,但我正在努力理解我在做什么以及代码中发生了什么。 我想在不同的电子表格之间划一行。 我在“核心”电子表格中有一个脚本,它在“主页”和“完成”表格链接之间移动一行到电子表格: 我搜索了如何将位于“已完成”工作表上的数据移动到另一个名为“数据库”的电子表格链接到电子表格: 但我想将数据从表“CORE”/“Finished”传输到表“database”/“DB”,而不重写DB

  • 我做了一个PHP脚本,使用api v4将一些信息导出到谷歌电子表格。当我尝试向单元格中添加注释时,我应该为每个注释向API发出请求,这对我来说是一个问题,前面已经解释过了。 我目前的方法是以下一种,我试图在单行的每一列上添加注释($HeaderNotes是一个数组): 在这种方法中,注释是一个接一个地添加的(使用循环),并且工作正常。主要的问题是,我做的请求和notes一样多,而谷歌的Cuota有

  • 我有一个谷歌电子表格,里面有多张表格,我想把每一张表格复制到一个新的电子表格中,并在一个特定的单元格中以文本命名新的电子表格。我很高兴运行脚本多次,所以我想让它复制活动表。 即。我所拥有的=称为“颜色”的电子表格——工作表1=“红色”,工作表2=“蓝色”,工作表3=“黄色”,等等。 我想要什么= 名为“红色”的电子表格。电子表格叫做"蓝色",电子表格叫做"黄色" 到目前为止,我有这个脚本,但它告诉