传递blob文件以将其作为电子邮件附件发送时出错

时间:2014-06-28 19:24:05

标签: google-apps-script google-sheets

我尝试在this rich answer之后使用Google Apps脚本发送文件作为电子邮件附件。但我没有使用独立的应用程序,而是在我的电子表格中尝试这样做,使用如下函数:

function sendAttachment(){
 var activeSheet = ss.getActiveSheet();
  ScriptProperties.setProperty('emailRequest', 1);
  if(!person_ID) {
    person_ID = getCurrentRow();
    //if the current line is the Column Headers line then ask the user to specify the ID, very rare case.
    if (person_ID == 1) {
      var person_ID = Browser.inputBox("Select one name.", "Click in one row:", Browser.Buttons.OK_CANCEL);
    }
  }
  var app = UiApp.createApplication().setHeight(400).setWidth(600);
  var panel = app.createVerticalPanel(); // you can embed that in a form panel
  var label = app.createLabel("Choose the receiver").setStyleAttribute("fontSize", 18);
  app.add(label);      
  var currentRow = ss.getActiveSelection().getRowIndex();
  var personName = activeSheet.getRange(currentRow, 1).getValue();
  var personNumber = activeSheet.getRange(currentRow, 5).getValue();
  var item1Panel = app.createHorizontalPanel();
  var txt = app.createTextBox().setId("item1").setName("item1").setValue(personName);
  item1Panel.add(app.createLabel("Person:")).add(txt);

  var item2Panel = app.createHorizontalPanel();
  var txt = app.createTextBox().setId("item2").setName("item2").setValue(personNumber);
  item2Panel.add(app.createLabel("Num:")).add(txt);

  var sheet = SpreadsheetApp.openById(letterSpreadsheetId).getSheetByName("emailsDB");
  var recipientEmailArray = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();  
  var item3Panel = app.createHorizontalPanel();
  item3Panel.add(app.createLabel("Receiver"));
  var listBox = app.createListBox().setName('item3');  
      for(var i = 0; i < (recipientEmailArray.length); i++){
        listBox.addItem(recipientEmailArray[i][0] + ": " + recipientEmailArray[i][2]);
  }
  item3Panel.add(listBox);
  var handlerBut = app.createServerHandler("butSendAttachment").addCallbackElement(panel);
  var but = app.createButton("submit").setId("submitButton4").addClickHandler(handlerBut);
  panel.add(item1Panel)
       .add(item2Panel)
       .add(item3Panel)
       .add(app.createFileUpload().setName('thefile'))
       .add(app.createLabel().setId("answer"))
       .add(but);  
  var scroll = app.createScrollPanel().setPixelSize(600, 400).setTitle("My title 1");
  scroll.add(panel);
  app.add(scroll);
  ss.show(app);


 // var handlerBut = app.createServerHandler("butSendAttachment").addCallbackElement(panel);
 // .add(app.createFileUpload().setName('thefile'));
 // var form = app.createFormPanel();
 // form.add(panel);
 // app.add(form);
  ;
}

function butSendAttachment(e){
  var recipientEmail = e.parameter.item3;
  var fileBlob = e.parameter.thefile;
  Logger.log("file blob = " + fileBlob);
  recipientEmail = recipientEmail.split(':')[1];
  var sheet = ss.getActiveSheet();
  var person_ID = getCurrentRow();
  var columns = getRowAsArray(sheet, 1);
  var personData = getRowAsArray(sheet, person_ID);  
  var sender = actAuthor + " \n          " + position;
  var name = personData[0];
  var motherName = personData[1];
  var title = "my title";
  var message = my mesage";
  var confirm = Browser.msgBox('Send email','Are you sure?', Browser.Buttons.OK_CANCEL);
  if(confirm=='ok'){
//    MailApp.sendEmail(recipientEmail, title, message, {attachments: [fileBlob]});
    MailApp.sendEmail(recipientEmail, title, message, {attachments: [fileBlob]});   
    var app = UiApp.createApplication().setHeight(150).setWidth(250);
    var msg = "An email was sendo to " + recipientEmail;
    app.setTitle("E-mail send!");
    app.add(app.createVerticalPanel().add(app.createLabel(msg)));
    var doc = SpreadsheetApp.getActive();
    doc.show(app);
  }
  else {
      return;
  }
}

但是我收到了这个错误:Execution failed: Invalid argument: inlineImages (line 77。第77行是:

MailApp.sendEmail(recipientEmail, title, message, {attachments: [fileBlob]});

我已阅读the documentation我尝试了几种参数变体。我的结论是fileBlob是Null。为什么?如何解决?

1 个答案:

答案 0 :(得分:0)

fileUpload小部件仅适用于表单父窗口小部件并使用doGet / doPost结构。

这是写在文档的某个地方但是现在我不记得到底在哪里(我稍后会看到)

但实际上我猜你可以在电子表格中构建这样的结构,只需更改函数名称并使用formPanel作为主要小部件。不要忘记您不再需要处理程序,并且必须使用submitButton小部件。

编辑:我多么愚蠢!它写在the widget's doc的第一行! ; - )