Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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 apps script 如何在同一电子表格中的多个工作表上自动运行google脚本_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 如何在同一电子表格中的多个工作表上自动运行google脚本

Google apps script 如何在同一电子表格中的多个工作表上自动运行google脚本,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有以下几点 情况: 我有一个电子表格,有10个工作表,15个用户登录并修改它 脚本函数: 在特定列中插入activesheet中两天之间的天数, 脚本比较第J列和第TodayDay列中的日期,并在第F列中插入差异 问题: 我无法使用定时触发器运行此脚本。我想为并发工作表每15分钟运行一次此脚本 测试用例: 只有在电子表格中只有一张工作表时,触发器才会定时运行。 如果我有多张工作表,则触发器不会随时间运行。 如果我将同一个触发器设置为OneEdit,则触发器仅对多个工作表运行 我需要每15分钟为

我有以下几点

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

脚本函数: 在特定列中插入activesheet中两天之间的天数, 脚本比较第J列和第TodayDay列中的日期,并在第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
    }
函数onOpen(){ var menuEntries=[{name:“UpdateAge”,functionName:“toTrigger”}, ]; var ss=SpreadsheetApp.getActiveSpreadsheet(); ss.添加菜单(“工具”,菜单)// } //创建一个计时器触发器,每15分钟调用一次“toTrigger” 函数toTrigger(){ var sh=SpreadsheetApp.getActiveSheet(); var data=sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
对于(var n=0;n当函数作为触发器运行时,没有活动工作表。只有当用户打开电子表格时,活动工作表才适用。请修改脚本以使用
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 */
}

澄清:当触发器执行时,它在服务器上作为一个完全独立的进程执行,并且不知道用户是否打开了工作表。在onEdit触发器的情况下,函数接收到一个事件,其中包含有关触发器源的信息。基于计时器的触发器不会获得这样的事件。因此,即使用户有工作表打开当基于计时器的触发器触发时,触发器功能将不知道用户正在查看哪个工作表。我希望这样:当用户登录到电子表格时,脚本应每15分钟运行一次。(注意:此脚本一次有两个以上的用户登录).1-如何使用getsheetbyName将此脚本修改为运行10张工作表?我将感谢您的帮助。Srik,您知道如何将此脚本设置为运行同一电子表格中的多张工作表吗?因为我的问题是,如果使用getsheetbyName,只需运行1张工作表。我需要每15分钟运行该脚本10张工作表。有没有办法告诉sc仅对工作表1、2、3、4、5运行以下功能?HI Srik返回错误“类型错误:无se puede llamar al método”getRange“de null.Ignorar”请参见我的编辑2013年6月13日为什么不使用电子表格功能?您可以计算每一行的日差而不必担心。请记住将参考日期和toda的日期作为函数参数发送。我不能为ex使用公式数组,因为电子表格每次都在修改中。当该行上的活动完成时,我们将删除它。
示例:如果我们使用公式,有人需要将公式拖动到新行,以避免任何错误或复杂的工作表。我使用此脚本自动插入数字,而没有任何问题。有人删除公式所在的单元格。
使用数组公式,但当您添加新行时,公式也不会使用数组自动拖动。
就我的情况而言,我无法实现一个公式。如果你有任何建议,请让我知道。
function toTrigger(sheetName){
  var sh = SpreadsheetApp.openById(ID OF SPREADSHEET).getSheetByName(sheetName);
  /* Your regular code */
}