使用DriveApp和Smartsheets Sync时缺少FormResponse对象

时间:2018-06-29 21:29:19

标签: google-apps-script

我的最终目标是从formSubmit触发的函数中访问通过Google表单上传的文件的内容。我在此问题的注释中添加了一些信息,但我认为我需要更新问题本身。当我停用Web表单中的Smartsheets Sync加载项时,所有这些都按预期工作。我的理论是,在某些情况下,Smartsheets Sync加载项不会保留Event对象。

我从开始:

function onFormSubmit (e) {
    Logger.log (e);
}

我设置了触发器并测试了表单提交,并且在日志中看到:

[<datetime>] {authMode=FULL, source=Form, response=FormResponse triggerUid=<id>}

符合预期。我还浏览了FormResponse对象,并验证了响应中是否包含有效的Google云端硬盘ID。

接下来,我向DriveApp.getFileById添加了呼叫:

function onFormSubmit (e) {
    Logger.log (e);

    var responses = e.response.getItemResponses ();
    var file = DriveApp.getFileById (responses [1].getResponse ());

    Logger.log (file);
}

重新提交表单会显示DriveApp的权限错误。毫不奇怪,因此我直接从脚本编辑器运行了onFormSubmit。它失败了,因为它是在没有Event对象的情况下调用的,但是它确实调用了允许我授予DriveApp权限的对话框。

现在,当我提交表单时,Event对象不包含FormResponse对象。从日志中:

[<datetime>] {authMode=FULL, source=Form, triggerUid=<id>}

因此,授予DriveApp权限是否以某种方式撤销了检查用户响应的权限?另外,我还有其他方法可以使用Google App脚本访问通过Google表单上传的文件吗?

1 个答案:

答案 0 :(得分:0)

文件ID放入文件上传答案(响应)中。以下代码获取文件上传问题的答案,即文件ID。请注意,数组的索引为零,因此第一个问题是索引为零。该代码假定文件上传问题是第一个问题。

如果这回答了您的问题,则可以通过单击绿色箭头将其标记为正确。

function onFormSubmit(e) {
  var file,fileID,form,responseID,submittedResponse,uploadResponse;

  responseID = e.response.getId();//The the ID of the current reponse
  Logger.log('responseID: ' + responseID)

  form = FormApp.getActiveForm();//Get the Form that this script is bound to

  submittedResponse = form.getResponse(responseID);//Get the response that
  //was just submitted

  uploadResponse = submittedResponse.getItemResponses()[0];//This assumes 
    //that the very first question is the file upload

  fileID = uploadResponse.getResponse();//Get the file ID of the file just uploaded
  Logger.log('fileID: ' + fileID)

  file = DriveApp.getFileById(fileID);//Get the file

  Logger.log('file.getName(): ' + file.getName());//verify that this is
    //the correct file - and that the code is working
}