应用程序脚本无法更新文档以包含表单编辑中的现有数据。

问题描述 投票:0回答:1

我一直在研究基于Google表单提交的自动填充表单的过程。 到目前为止,我所有的进展都是在这个网站上学到的。 谢谢大家的帮助

我得到了一切工作正是它需要运行的,假设表格是完整填写的。 技术员填写了谷歌表格并提交。heshe提交后,脚本自动生成一个包含所有数据的自定义文档。

经过一段时间的运行,技术人员要求我们在提交后使谷歌表格可以编辑。 我做了一些研究,发现你可以使表单可编辑,并写了一些脚本为每个表单自动生成一个自定义URL。

现在我遇到了一个问题,当提交部分表格时,自动Doc。 如果技术人员填写了表格的前半部分并提交,就会自动生成一个只有前半部分数据的Doc,这是我所期望的。 现在,如果他们回去填写表格的第2部分,只有Doc的第2部分被填写。 我以为它会从Sheet中提取整行数据,但事实并非如此。

经过一番思考,我想我需要重写代码为 在提交表格时自动生成Doc,因为越来越多的表格会被分块填写,并在以后完成。

这是我想做的。 任何见解或有用的链接将是非常感激! 非常感谢!

目前所有的表格数据都进入了工作表,Tab A,我将在工作表上有第二个Tab B,命名为 "Data to Doc"。 我将手动梳理Tab A,并将数据复制和粘贴到我想创建Doc的Tab B。 在工作表B上,会有一个按钮,我可以点击它来运行脚本,将工作表数据转换为Doc文件。

我发现了一个视频,我认为我想做什么,但我似乎不能使我的代码工作的方式,他们做的。https:/www.youtube.comwatch?v=r9uU_KwGgzQ

以下是我目前的代码。

var docTemplate = "fdgfdg"; 
var docName = "Technician Report";
var folder = DriveApp.getFolderById('hjhjghhgjgh');

function onFormSubmit(e) {
var replaceTextToImage = function(body, searchText, fileId) {
 var width = 300; // Please set this.
 var blob = DriveApp.getFileById(fileId).getBlob();
 var r = body.findText(searchText).getElement();
 r.asText().setText("");
 var img = r.getParent().asParagraph().insertInlineImage(0, blob);
 var w = img.getWidth();
 var h = img.getHeight();
 img.setWidth(width);
 img.setHeight(width * h / w);
}

//Get information from form and set as variables
var Technician = e.values[1];
var Customer_Name = e.values[2];
var Date = e.values[3];
var Facility_Location = e.values[4];
var WO_Project_No = e.values[5];
var PO_No = e.values[6];
var Tag_No = e.values[7];
var Site_Contact = e.values[8];
var Repair_Scope = e.values[9];
var Valve_Serial_No = e.values[10];
var Valve_Model = e.values[11];
var Valve_Condition = e.values[12];
var Valve_Action = e.values[13];
var Act_Serial_No = e.values[14];
var Act_Model = e.values[15];
var Act_Condition = e.values[16];
var Act_Action = e.values[17];
var Cont_Serial_No = e.values[18];
var Cont_Model = e.values[19];
var Cont_Condition = e.values[20];
var Cont_Action = e.values[21];
var Recommended_Actions = e.values[30];
var Call_Notes = e.values[32];
var Picture1_Notes = e.values[23];
var Picture2_Notes = e.values[25];
var Picture3_Notes = e.values[27];
var Picture1_Image = e.values[22].split("=")[1];
var Picture2_Image = e.values[24].split("=")[1];
var Picture3_Image = e.values[26].split("=")[1];



// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DriveApp.getFileById(docTemplate)
.makeCopy(docName+' for '+Customer_Name+' '+Tag_No, folder)
.getId();  
 // Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getBody();


copyBody.replaceText('A1', Technician);
copyBody.replaceText('A2', Customer_Name);
copyBody.replaceText('A3', Date);
copyBody.replaceText('A4', Facility_Location);
copyBody.replaceText('A5', WO_Project_No);
copyBody.replaceText('A6', PO_No);
copyBody.replaceText('A7', Tag_No);
copyBody.replaceText('A8', Site_Contact);
copyBody.replaceText('A9', Repair_Scope);
copyBody.replaceText('B1', Valve_Serial_No);
copyBody.replaceText('B2', Valve_Model);
copyBody.replaceText('B3', Valve_Condition);
copyBody.replaceText('B4', Valve_Action);
copyBody.replaceText('B5', Act_Serial_No);
copyBody.replaceText('B6', Act_Model);
copyBody.replaceText('B7', Act_Condition);
copyBody.replaceText('B8', Act_Action);
copyBody.replaceText('B9', Cont_Serial_No);
copyBody.replaceText('C1', Cont_Model);
copyBody.replaceText('C2', Cont_Condition);
copyBody.replaceText('C3', Cont_Action);
copyBody.replaceText('C4', Recommended_Actions);
copyBody.replaceText('C5', Call_Notes);
copyBody.replaceText('C8', Picture1_Notes);
copyBody.replaceText('D1', Picture2_Notes);
copyBody.replaceText('D3', Picture3_Notes);
replaceTextToImage(copyBody, 'C7', Picture1_Image);
replaceTextToImage(copyBody, 'C9', Picture2_Image);
replaceTextToImage(copyBody, 'D2', Picture3_Image);


copyDoc.saveAndClose();

google-apps-script google-sheets google-docs google-form
1个回答
0
投票

假设你有一个脚本绑定到你的表格与一个 onSubmit 触发器,您可以检索最新的响应长度,并将其与问题总数进行比较。

function myFunction(e) {
  var length = FormApp.getActiveForm().getItems().length;
    if(e.response.getItemResponses().length == length){
    //proceed to generate custom document
  }else{   
    Logger.log("Form is not complete");
  }
}

UPDATE: 备选方案 如果复选框被选中,则创建文档。

  • 在这种情况下,你不希望在表单提交时运行该函数,而是在对复选框进行编辑时运行。

  • 因此,将 onSubmit 触发 onEdit 触发器。

  • 这将允许你访问事件对象 e.range, e.oldValuee.value.

  • 你可以实现一个 if 语句,只有在对复选框列进行了编辑,并且旧值为 false (unchecked) and the new one istrue`(选中)。
  • 不幸的是,你不能检索到你的表单响应 onEdite.values相反,你可以验证哪个行的复选框被选中了,并使用 sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues();
  • 要实现这一改变,请创建一个带有复选框的列(比如说在第29列,因为前面的列都被响应占用了),然后将你的代码修改如下。
function onEdit(e){
  if(e.range.getColumn() == 29 || e.oldValue == false && e.value == true){
    var row = e.range.getRow();
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    var values = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
    var replaceTextToImage = function(body, searchText, fileId) {
      var width = 300; // Please set this.
      var blob = DriveApp.getFileById(fileId).getBlob();
      var r = body.findText(searchText).getElement();
      r.asText().setText("");
      var img = r.getParent().asParagraph().insertInlineImage(0, blob);
      var w = img.getWidth();
      var h = img.getHeight();
      img.setWidth(width);
      img.setHeight(width * h / w);
    }

    //Get information from form and set as variables
    var Technician = values[1];
    var Customer_Name = values[2];
   ...
   ... 
    copyDoc.saveAndClose();
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.