javascript - SpreadsheetApp.openById 未通过 Google 电子表格

标签 javascript google-apps-script google-sheets google-apps

当我点击打开我的谷歌电子表格时弹出的消息框时,我正在尝试运行函数 "onReportOrApprovalSubmit()"。当我在脚本编辑器中运行该函数时,它运行得非常好。但是,当我尝试使用首次打开电子表格时弹出的消息框运行它时,该函数停止运行/卡在该行之前:

 "var approvalsSpreadsheet = SpreadsheetApp.openById(APPROVALS_SPREADSHEET_ID);"

有人知道为什么会这样吗?

    var APPROVALS_SPREADSHEET_ID = "1NC6mBPRXKCA4Blbn7C9lFt9YnTZioS3_vidbVuPvZos";
    var APPROVAL_FORM_URL = "https://docs.google.com/a/londonhydro.com/forms/d/1BKuKdNwsUDXyLdqy18GAcQmE_SzS7Sq_OTxVNwyCH44/viewform";
    var STATE_MANAGER_EMAIL = "MANAGER_EMAIL";
    var STATE_APPROVED = "APPROVED";
    var STATE_DENIED = "DENIED";
    var COLUMN_STATE = 6;
    var COLUMN_COMMENT = 7;


    function onReportOrApprovalSubmit() {
      // This is the Expense Report Spreadsheet
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheets()[0];

      // Also open the Approvals Spreadsheet

      var ui = SpreadsheetApp.getUi(); // DEBUG
      ui.alert("heelo"); // DEBUG
      var approvalsSpreadsheet = SpreadsheetApp.openById(APPROVALS_SPREADSHEET_ID);

      var ui = SpreadsheetApp.getUi(); // DEBUG
      ui.alert('Requests sentsee'); // DEBUG

      var approvalsSheet = approvalsSpreadsheet.getSheets()[0];
      // Fetch all the data from the Expense Report Spreadsheet
      // getRowsData was reused from Reading Spreadsheet Data using JavaScript Objects tutorial
      var data = getRowsData(sheet);

      // Fetch all the data from the Approvals Spreadsheet
      var approvalsData = getApprovalData(approvalsSheet);

      // For every expense report
      for (var i = 0; i < data.length; i++) {

        var row = data[i];
        row.rowNumber = i + 2;
        Logger.log("Row num: " + row.rowNumber);
        Logger.log("row state before: " + row.state);
        Logger.log("row email before: " + row.emailAddress);

        if (!row.state) {
          Logger.log("row state: " + row.state);
          sendReportToManager(row);
          sheet.getRange(row.rowNumber, COLUMN_STATE).setValue(row.state);
          Logger.log("row state: " + row.state);

        } else if (row.state == STATE_MANAGER_EMAIL) {

          for (var j = 0; j < approvalsData.length; ++j) {

            var approval = approvalsData[j];

            if (row.rowNumber != approval.expenseReportId) {
              Logger.log("failed expenseId: " + approval.expenseReportId + " rowNumber: " + row.rowNumber);
              continue;
            }

            Logger.log("pass");
            // Email the employee to notify the Manager's decision about the expense report.
            sendApprovalResults(row, approval);
            // Update the state of the report to APPROVED or DENIED
            sheet.getRange(row.rowNumber, COLUMN_STATE).setValue(row.state);
            break;
          }
        }
      }
    }

    Row = function(){
    };

    function getRowsData(sheet){
      var data = sheet.getDataRange().getValues();
      var row = new Row();
      var rows = [];

      var counter = 0;

      for (var i = 0; i < data.length; i++) {

        row = new Row();
        row.time = data[i][0];
        row.emailAddress = data[i][1];
        row.amount = data[i][2];
        row.description = data[i][3];
        row.managersEmailAddress = data[i][4];
        row.state = data[i][5];


        if(i != 0){
          Logger.log("row state1: " + row.state);
          rows[counter] = row;
          counter++;
        }
      }
      Logger.log("rowsss:");
      Logger.log(rows);
      Logger.log("data length: " + rows.length);

      Logger.log("data display: ");

      for(var k = 0; k < rows.length; k++){
       Logger.log(rows[k].state); 
      }
      return rows;

    }


    ApprovalData = function(){

    };

    function getApprovalData(sheet){
      var data = sheet.getDataRange().getValues();
      var row = new ApprovalData();
      var rows = [];
      for (var i = 0; i < data.length; i++) {

        row.time = data[i][0];
        row.emailAddress = data[i][1];
        row.expenseReportId = data[i][2];
        row.approveExpenseReport = data[i][3];
        row.comments = data[i][4];

        rows[i] = row;

      }

      return rows;
    }


    // Sends an email to an employee to communicate the manager's decision on a given Expense Report.
    function sendApprovalResults(row, approval) {
      var approvedOrRejected = (approval.approveExpenseReport == "Yes") ? "approved" : "rejected";
      var message = "<HTML><BODY>"
        + "<P>" + approval.emailAddress + " has " + approvedOrRejected + " your expense report."
        + "<P>Amount: $" + row.amount
        + "<P>Description: " + row.description
        + "<P>Report Id: " + row.rowNumber
        + "<P>Manager's comment: " + (approval.comments || "")
        + "</HTML></BODY>";
      MailApp.sendEmail(row.emailAddress, "Expense Report Approval Results", "", {htmlBody: message});
      if (approval.approveExpenseReport == "Yes") {
        row.state = STATE_APPROVED;
      } else {
        row.state = STATE_DENIED;
      }
    }

    // Sends an email to a manager to request his approval of an employee expense report.
    function sendReportToManager(row) {
      var message = "<HTML><BODY>"
        + "<P>" + row.emailAddress + " has requested your approval for an expense report."
        + "<P>" + "Amount: $" + row.amount
        + "<P>" + "Description: " + row.description
        + "<P>" + "Report Id: " + row.rowNumber
        + '<P>Please approve or reject the expense report <A HREF="' + APPROVAL_FORM_URL + '">here</A>.'
        + "</HTML></BODY>";
      MailApp.sendEmail(row.managersEmailAddress, "Expense Report Approval Request", "", {htmlBody: message});
      row.state = STATE_MANAGER_EMAIL;
      Logger.log("id: " + row.rowNumber);
    }



    function onOpen() {
      var ui = SpreadsheetApp.getUi(); // Same variations.

      var result = ui.alert(
         'Do you want to get new requests?',
          ui.ButtonSet.YES_NO);

      // Process the user's response.
      if (result == ui.Button.YES) {
        // User clicked "Yes".
        onReportOrApprovalSubmit();
        ui.alert('Requests sent');
      } else {
        // User clicked "No" or X in the title bar.
        ui.alert('No requests sent');
      }
    }

最佳答案

onOpen 函数只能访问它绑定(bind)的电子表格,不能访问其他电子表格。 UI 提示不会改变这一点:显示自定义对话框不会向该功能添加任何授权。无法从 launched by a simple trigger 进程访问其他电子表格,例如 onOpen。​​

解决方案:让 onOpen 添加将用于启动任何需要授权的功能的菜单项。

function onOpen() {
  var menu = [{name: "Get New Requests", functionName: "onReportOrApprovalSubmit"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("Script", menu);
}

关于javascript - SpreadsheetApp.openById 未通过 Google 电子表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38227837/

相关文章:

jquery - 隐藏行内容时折叠 Google Vis 表

google-apps-script - 当用户打开工作表或单击工作表中的链接时,Google Sheets 附加组件会自动打开

javascript - Google 表格 - 删除包含字符的行

arrays - 有没有一种简单的方法可以在给定一组数据的情况下查找多个标题列?

php - 通过 Google Drive API 从本地 CSV 文件创建 Google Drive 电子表格

javascript - Symfony 5 & FOSCKEDITOR : create a simple custom plugin, 此插件的图标未出现在 Ckeditor 工具栏中

javascript - 如何在 github 存储库上隐藏 api key ?

javascript - 如何在查找对话框中按下回车键时进行 jqGrid 搜索

JavaScript:如果语句在循环中不起作用

javascript 变量未在节点中更新