代码之家  ›  专栏  ›  技术社区  ›  gonzalo2000

脚本在手动运行时有效,但触发器不起作用

  •  1
  • gonzalo2000  · 技术社区  · 1 年前

    我有许多GoogleScript项目,它们在表单提交时与触发器可靠地工作。离开办公桌几个月后,我创建了一个项目,尽管手动运行脚本时脚本可以正常工作,但触发器(在表单提交时)没有效果。几个小时后,我收到电子邮件报告,其中列出错误为“执行该操作需要授权”。我发现其他人以前也有过此类错误。我尝试过注销和重新登录,并删除项目触发器并将其添加回来。

    任何帮助都将不胜感激——我的组织已经开始依赖触发器运行脚本。我在下面附上我的脚本,如果是脚本本身的问题。

    function sendLike() {
        var mainSheet = SpreadsheetApp.openById('12345');
    
        var sheet = mainSheet.getSheetByName('Likes');
        var lastRow = sheet.getLastRow();
        
        var timestamp = sheet.getRange(lastRow, 1).getValue();
        var teacher = sheet.getRange(lastRow, 2).getValue();
        var grade = sheet.getRange(lastRow, 3).getValue();
        
        if (grade == "sixth") {
          gradeColumn = 4;
        } else if (grade == "seventh") {
          gradeColumn = 5;
        } else if (grade == "eighth") {
          gradeColumn = 6;
        }
        
        var studentName = sheet.getRange(lastRow, gradeColumn).getValue();
    
        var positiveDescription = sheet.getRange(lastRow, 7).getValue();
        
        var roster;
        var rosterSheetLastRow;
        var rosterArray;
        var teacherRow;
        var currentTally;
        var updatedTally;
    
        var rosterSheet = mainSheet.getSheetByName(grade);
        
        var receivedLikeSubject = "You got a Like!";
        var receivedLikeMessage = "Well done!";
          
        //only accept likes from staff (in the staff_roster sheet)
        var staffFlag = false;
        var teacherRosterSheet = mainSheet.getSheetByName('staff_roster');
        var staffLastRow = teacherRosterSheet.getLastRow();
        var teacherArray = teacherRosterSheet.getRange(2, 1, (staffLastRow - 1)).getValues();
        var teacherTotalLikes = 0;
        var teacherNewLikes = 0;
        var staffRow = 0;
    
        var j;
          for (j = 0; j < staffLastRow; j++) { 
            if (teacherArray[j] == teacher) {
              staffFlag = true;
              staffRow = j + 2;
            }
          }
        
        if (staffFlag) {   
          //tally counter
          rosterSheetLastRow = rosterSheet.getLastRow();
          rosterArray = rosterSheet.getRange(2, 1, (rosterSheetLastRow - 1)).getValues();
          var studentRow = 0;
          var currentTally = 0;
          var studentId = "";
          var studentEmail = "";
          var newTally = 0;
    
          var i;
          for (i = 0; i < rosterSheetLastRow; i++) { 
            if (rosterArray[i] == studentName) {
              studentRow = i + 2;
              currentTally = rosterSheet.getRange(studentRow, 3).getValue();
              newTally = currentTally + 1;
              rosterSheet.getRange(studentRow, 3).setValue(newTally); //update likes tally in grade roster
              studentId = rosterSheet.getRange(studentRow, 2).getValue();
            }
          }
          
          teacherTotalLikes = teacherRosterSheet.getRange(staffRow, 2).getValues();
          teacherNewLikes = parseInt(parseInt(teacherTotalLikes) + 1);
          teacherRosterSheet.getRange(staffRow, 2).setValue(teacherNewLikes);
    
          studentEmail = studentId +"@asdf.org";
    
          MailApp.sendEmail({
          to: studentEmail,
          subject: receivedLikeSubject,
          htmlBody: receivedLikeMessage
          });
        }   
      }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   LuniZunie    1 年前
    我不再经常使用谷歌应用程序脚本,但我认为问题是你不允许授权,要解决这个问题,请执行以下操作。

    • 在右上角单击“部署”下拉列表
    • 单击“新建部署”
    • 然后将部署类型(弹出窗口最左边的装备)设置为“Web应用程序”
    • 将“执行方式”下拉列表设置为“我”
    • 将“谁有权访问”设置为“任何人”
    • 你应该得到一个屏幕,看起来像这样: enter image description here
    • 单击“授权访问”,然后单击“完成”
    除此之外,请确保您从表单创建谷歌应用程序脚本,而不是相反,请执行以下操作:

    • 打开表单
    • 单击左上角的三个点
    • 单击脚本编辑器