3

Googleのスプレッドシートを開いたときに表示されるメッセージボックスをクリックすると、"onReportOrApprovalSubmit()"という関数を実行しようとしています。この関数は、スクリプトエディタで実行すると完全に正常に動作します。これはなぜSpreadsheetApp.openByIdがGoogleスプレッドシートを通過しない

"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'); 
     } 
    } 

答えて

1

機能開く時だけで、それがない他の人にバインドされているスプレッドシートにアクセスすることができます。 UIプロンプトはそれを変更しません。カスタムダイアログを表示しても、その機能には何の権限も追加されません。 onOpenなど、launched by a simple triggerのプロセスから他のスプレッドシートにアクセスすることはできません。

解決方法:承認が必要な機能を起動するために使用されるメニュー項目を追加します。

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

ありがとうございます!できます。 – Jackie

関連する問題