Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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

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 apps script 时间驱动触发器(每天)不每天触发_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 时间驱动触发器(每天)不每天触发

Google apps script 时间驱动触发器(每天)不每天触发,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有类似的问题,如中所述 我在谷歌的一个表单中有一个特定的脚本,带有一个每日触发器(时间驱动,应该每天早上触发,通过界面设置,而不是编程)。但是脚本并不是每天都执行。我可以在执行报告中看到这一点,其中只有成功的执行,没有失败的执行。我还可以通过检查工作表中的一个单元格来查看脚本是否执行,当脚本运行时,该单元格会被更新为执行时间戳。我已经在触发器设置中为失败的执行设置了即时通知 在我的具体案例中,脚本应该每天从11月9日到11月13日运行,但它只在11月9日、11月10日和11月12日运行。我没有

我有类似的问题,如中所述

我在谷歌的一个表单中有一个特定的脚本,带有一个每日触发器(时间驱动,应该每天早上触发,通过界面设置,而不是编程)。但是脚本并不是每天都执行。我可以在执行报告中看到这一点,其中只有成功的执行,没有失败的执行。我还可以通过检查工作表中的一个单元格来查看脚本是否执行,当脚本运行时,该单元格会被更新为执行时间戳。我已经在触发器设置中为失败的执行设置了即时通知

在我的具体案例中,脚本应该每天从11月9日到11月13日运行,但它只在11月9日、11月10日和11月12日运行。我没有收到任何关于执行失败的通知

该脚本本身不使用任何API,它非常基本:读取一个工作表中的数据,进行一些计算并写入另一个工作表(在单个Google工作表文件中讨论工作表)

如果我手动运行main函数,它总是工作的

我很高兴能得到一些可能出错的想法。谢谢

编辑:代码示例(数组的主要功能和原型。包括)


应用程序脚本触发器一直有点挑剔。但最近,它们比平常更不可靠(有一些关于虚假触发和其他疾病的报告)

在这种情况下,您可以通过利用外部服务(例如)来避免完全使用它们


您必须重构应用程序脚本项目,并使用
doPost(e)
函数将其作为公共部署。然后将Web应用程序的url作为每天调用的Web钩子端点传递给外部服务。

应用程序脚本触发器总是有点挑剔。但最近,它们比平常更不可靠(有一些关于虚假触发和其他疾病的报告)

在这种情况下,您可以通过利用外部服务(例如)来避免完全使用它们


您必须重构应用程序脚本项目,并使用
doPost(e)
函数将其作为公共部署。然后,您可以将Web应用程序的url作为每天调用的Web钩子端点传递给外部服务。

您好,您能提供您正在使用的代码示例吗?没问题,问题中添加了代码。唯一不存在的是函数fillTheSheet(yearMonth,data),但它没有什么特别之处——它只是用变量数据中的值填充另一张表;)您好,您能提供您正在使用的代码示例吗?没问题,问题中添加了代码。唯一不存在的是函数fillTheSheet(yearMonth,data),但它没有什么特别之处——它只是用变量数据中的值填充另一张表;)好的,总结一下(希望是正确的方式):-谷歌的触发器不可靠-另一个选择是使用外部服务-另一个选择是以编程方式设置/使用触发器(虽然我还没有测试它是否可靠),好的,总结一下(希望是正确的方式):-谷歌的触发器不可靠-另一个选项是使用外部服务-另一个选项是以编程方式设置/使用触发器(尽管我还没有测试它是否可靠)
function main(){
  var date = new Date();
  //var date = new Date(2019, 9, 1); // year, month (zero-indexed!!!), day
  //var date = new Date(date.getYear(), date.getMonth()-3); // testing
  var currentDay = Utilities.formatDate(date, "CET", "d");
  Logger.log('currentDate: ' + Utilities.formatDate(date, "CET", "YYYY-MM-dd HH:mm:ss.S") + ' | currentDay: ' + currentDay);

  if (currentDay == 1) {
    Logger.log('currentDay is 1st of the month');
    date = new Date(date.getYear(), date.getMonth() - 1);
    var newCurrentDay = Utilities.formatDate(date, "CET", "d");
  }
  var monthToCheck = Utilities.formatDate(date, "CET", "MMMM").toUpperCase();
  var yearToCheck = Utilities.formatDate(date, "CET", "YYYY");
  Logger.log('dateToCheck: ' + Utilities.formatDate(date, "CET", "YYYY-MM-dd HH:mm:ss.S") + ' | monthToCheck: ' + monthToCheck + ' | yearToCheck: ' + yearToCheck);

  var firstProjectRow = 7;   // first row with the project data
  var firstProjectCol = 1;   // first column with project data - should contain Tool IDs
  var numOfProjectRows = 999;   // num of project rows to check (counted from and including var firstProjectRow)
  var numOfProjectCols = 21;   // num of project columns to check (counted from and including var firstProjectCol the last one contains number of hours for the last service)
  var firstProjectHoursCol = 7;   // first column with data about project hours (usually PM hours)
  // ************* DO NOT EDIT BELOW THIS LINE ************* //

  //return;

  var indexedFirstProjectHoursCol = firstProjectHoursCol - 1;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //var sheet = ss.getSheets()[3];
  var sheetName = monthToCheck + ' ' + yearToCheck;
  var sheet = ss.getSheetByName(sheetName);
  Logger.log('sheet: ' + sheetName);
  var range = sheet.getRange(firstProjectRow, firstProjectCol, numOfProjectRows, numOfProjectCols); // getRange(row, column, numRows, numColumns)
  var rangeValues = range.getValues();
  //Logger.log('rangeValues: "' + rangeValues);
  var toolData = new Array();
  var toolIds = new Array();
  var toolHours = new Array();
  //return;

  for (var row in rangeValues) {
    Logger.log('row: "' + row);
    var clientId = rangeValues[row][0];
    var projectId = rangeValues[row][1];
    var hoursSum = 0;

    // we have Tool ID so it's OK to proceed
    if (clientId != "" && projectId != "") {
      var clientProjectId = clientId + "-" + projectId;
      for (var col in rangeValues[row]) {
        var cellValue = rangeValues[row][col];
        //Logger.log('col: ' + col + ' value: ' + value);

        // get hours sum
        if (col >= indexedFirstProjectHoursCol)
          hoursSum += typeof cellValue == 'number' ? cellValue : 0;
      }
      //Logger.log('hoursSum: [' + hoursSum + ']');

      var record = {id: clientProjectId, hours: hoursSum};
      Logger.log("Data: " + record.id + " : " + record.hours);
      // don't yet have a record of clientId-projectId
      if (!toolIds.includes(clientProjectId)) {
        toolData.push(record);
      }
      else {
        recordIdx = toolIds.indexOf(clientProjectId);
        toolData[recordIdx].hours += hoursSum;
      }

      toolIds = [];
      toolHours = [];
      toolData.forEach(function(item) {
        toolIds.push(item.id);
        toolHours.push(item.hours);
      });

    }
    //Logger.log(toolData);
    //Logger.log('ROW DONE!');
  }

  Logger.log('ROWS DONE!');
  Logger.log('toolData.length: ' + toolData.length);
  toolData.forEach(function(item) {
    Logger.log('toolData: ' + item.id + " : " + item.hours);
  });  
  Logger.log('DONE!!!');


  // fill the table in the sheet with assigned number of hours
  fillTheSheet(sheetName, toolData);
}