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

如何在同一电子表格中的多个工作表上自动运行谷歌脚本

窦宏旷
2023-03-14

我有以下脚本。

我有一个电子表格,有10个工作表和15个用户登录并修改它。

在特定列中插入activesheet中两天之间的天数,脚本比较第J列中的日期和今天,并在第F列中插入差值。

我不能使用定时触发器运行此脚本。我想为并发工作表每15分钟运行一次这个脚本。

只有在电子表格中只有一张工作表时,触发器才会定时运行。如果我有多张工作表,则触发器不会随时间运行。如果我将同一个触发器设置为OneEdit,则触发器仅对多个工作表运行。

我需要每15分钟为所有工作表或活动工作表运行此脚本,因为我还有两个脚本运行OnEdit。当我在OneEdit中设置此脚本时,电子表格将缓慢地旋转。

    function onOpen() {
      var menuEntries = [ {name: "UpdateAge", functionName: "toTrigger"},
                         ];
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      ss.addMenu("Tools",menuEntries);//
    }

    // create a timer trigger that will call "toTrigger" every 15 minutes

    function toTrigger(){
      var sh = SpreadsheetApp.getActiveSheet();
      var data = sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
      for(var n=0;n<data.length;++n){
      if(typeof(data[n][9])=='object'){
        data[n][5]=dayToToday(data[n][9])
          }
        }
       sh.getRange(1,1,data.length,data[0].length).setValues(data) 
    }

    function dayToToday(x){
      var refcell = x;;// get value in column A to get the reference date
      var refTime = new Date(refcell);
      var ref = refTime.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
      var today = new Date();
      var TD = today.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
      var day = parseInt(TD-ref);// get the difference in days (integer value )
      return day ; // return result that will be in cell
    }

嗨,斯瑞克,

非常感谢现在正在工作。

    function onOpen() {
      var menuEntries = [ {name: "UpdateAge", functionName: "shellFunction"},
                         ];
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      ss.addMenu("Tools",menuEntries);//
    }

        function shellFunction(){
        var sheets = ['Sheet1','Sheet2','Sheet3','Sheet4']; 
        for (var s in sheets){
      toTrigger(sheets[s]);
        }
      }

      // create a timer trigger that will call "toTrigger" every 15 minutes

      function toTrigger(sheetName){
      var ss = SpreadsheetApp.openById('SHEET ID');
      var sh = ss.getSheetByName(sheetName);
      var data = sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
      for(var n=0;n<data.length;++n){
      if(typeof(data[n][9])=='object'){
        data[n][5]=dayToToday(data[n][9])
          }
        }
       sh.getRange(1,1,data.length,data[0].length).setValues(data) 
    }

    function dayToToday(x){
      var refcell = x;;// get value in column A to get the reference date
      var refTime = new Date(refcell);
      var ref = refTime.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
      var today = new Date();
      var TD = today.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
      var day = parseInt(TD-ref);// get the difference in days (integer value )
      return day ; // return result that will be in cell
    }

共有1个答案

汪永春
2023-03-14

当函数作为触发器运行时,没有活动工作表。只有当用户打开电子表格时,活动工作表才适用。修改您的脚本以使用getSheetByName,一切都应该工作正常。

如果你想让它在多个工作表上工作,只需从另一个函数调用这个函数...

function shellFunction(){
  var sheets = ['sheet1','sheet2',etc]; 
  for (var s in sheets){
    toTrigger(sheets[s]);
  }
}

并将toTrigger函数更改为接收图纸名称作为参数。

function toTrigger(sheetName){
  var sh = SpreadsheetApp.openById(ID OF SPREADSHEET).getSheetByName(sheetName);
  /* Your regular code */
}
 类似资料:
  • 我有一个谷歌电子表格,有两张叫做罗宾和露西的表格。每次我向列A添加一些数据时,我都制作/找到/破坏了一个脚本来对工作表上的数据进行排序 这个剧本很棒,但我只想把它应用在第一张纸上,罗宾。第二个工作表中的数据,Lucy,是不一样的,所以我将创建另一个脚本为不同的范围,一旦我得到了这个问题的头脑。 我想我需要使用getSheetByName(“罗宾”),但我似乎无法让它工作。提前感谢

  • 我是天然气新手,我写了一个脚本来进行价格比较,它基本上得到产品的价格,储存它们,每天通过基于时间的触发器检查价格是否发生变化,如果价格发生变化,发送电子邮件,如果没有变化,什么也不做。 所以现在我陷入困境,我想在电子表格中添加更多的工作表,我需要在所有工作表中运行相同的脚本,但我不知道如何管理它。 据我所知,现在我的脚本是基于这个功能运行的 “var ss=SpreadsheetApp.getAc

  • 可编辑链接-https://docs.google.com/spreadsheets/d/1vrzchTHVwwzc9wgFGmtc_zBsh27CEtE7KOyeNDuLwC0/edit?usp=sharing 发布至网页-https://docs.google.com/spreadsheets/d/e/2PACX-1vRaJd3YpKnemAneU47RI58m7cxQsYFdViFBxJPV

  • B页中有图表,其中有源数据。我想以这样一种方式将图表导入到主电子表格B中,当图表在表格B中更改时,它也应该在主表格A中动态更改。 经过大量的研究,我能够找到以下内容: Importrange-只导入数据,而不是图表 复制图表本身并将其粘贴到主工作表A,但当图表在工作表B中动态变化时,它不会更改。 发布图表并将URL作为图像插入-如果主表A是google电子表格,则不起作用,但适用于google文档

  • 我正在尝试从多个google电子表格中删除一个特定的表格。 我有一个主电子表格,从所有其他电子表格收集数据。从主电子表格中,我可以在其他电子表格中执行不同类型的操作,如添加工作表、重命名工作表、隐藏和锁定工作表。 但无法删除其他电子表格中的表格。查看了其他线程,但找不到任何解决方法。 这就是我到目前为止得到的。它停在这一排: "fname.delete表(本周);}" 我很感谢大家对我的帮助,因为

  • 所以,现在我正在使用谷歌表单将数据添加到我的电子表格中。我想添加我的第二个谷歌表单响应下面我的第一个谷歌表单响应自动添加行(我做这个过程在另一个表使用importrange),即使在我的第一个谷歌响应有一些数据。这两个谷歌表单的内容保持不变,所以我想在1页中看到它。 我之所以要这样做,是为了尽量减少创建另一个电子表格来收集所有数据。当我这样做时,总是会收到一条错误消息“#REF!”因为我知道谷歌表