Google apps script 为Google表单条目添加审批步骤->;谷歌表单/文档

Google apps script 为Google表单条目添加审批步骤->;谷歌表单/文档,google-apps-script,google-sheets,automation,google-forms,Google Apps Script,Google Sheets,Automation,Google Forms,我希望将此公开信/谷歌套件工作流()与额外的批准步骤结合起来,这需要某种形式的批准(例如,谷歌工作表中的复选框,或谷歌工作表中的某种编辑/更改),然后才将信息传递给最终的谷歌文档。我已经能够使用杰弗里·埃弗哈特(Jeffrey Everhart)的代码(见下文)成功地设置一个Google表单->Google表单->Google文档公开信工作流,该工作流获取Google表单信息并在表单提交时将其添加到Google文档中。但我无法让脚本在编辑/更改触发器上工作,尽管我昨天一整天都在努力。这将是理想的

我希望将此公开信/谷歌套件工作流()与额外的批准步骤结合起来,这需要某种形式的批准(例如,谷歌工作表中的复选框,或谷歌工作表中的某种编辑/更改),然后才将信息传递给最终的谷歌文档。我已经能够使用杰弗里·埃弗哈特(Jeffrey Everhart)的代码(见下文)成功地设置一个Google表单->Google表单->Google文档公开信工作流,该工作流获取Google表单信息并在表单提交时将其添加到Google文档中。但我无法让脚本在编辑/更改触发器上工作,尽管我昨天一整天都在努力。这将是理想的,因为我可以简单地在google表单中添加一个复选框“Approval”列,指示表单提交是否应继续添加到google文档的下一步。有什么建议吗

函数附录SignatureRow(e){
//由于可能会有一群人提交,因此每次执行时我们都会锁定脚本
//有30秒的超时时间,因此不会覆盖任何内容
const lock=LockService.getScriptLock();
lock.waitLock(30000);
//这里我们从表单提交事件中读取变量
const date=新日期(e.values[0])。toLocaleDateString();
//当然,如果您希望文档中的时间,可以使用toLocaleString方法
const name=e.values[1];
const affiliation=e.values[2];
const country=e.values[3];
//接下来,将这些值格式化为对应于表行布局的数组
//在你的谷歌文档中
const tableCells=[姓名、隶属关系、国家/地区、日期]
//下一步,我们打开信,得到它的正文
const letter=DocumentApp.openById('INSERT ID HERE')
const body=letter.getBody();
//接下来,我们得到文档中的第一个表,并附加一个空表行
const table=body.getTables()[0]
const tableRow=table.appendTableRow()
//在这里,我们从上方循环遍历表格单元格并添加
//将表格单元格添加到每个数据段的表格行
tableCells.forEach(函数(单元格,索引){
设appendedCell=tableRow.appendTableCell(单元格)
})
//在这里,我们保存并关闭信件,然后释放锁
letter.saveAndClose();
锁。释放锁();

}
如何使用
onFormSubmit
将复选框添加到谷歌表单中的每个条目,并使用
onEdit
验证复选框并写入谷歌文档

在这里,我为
onFormSubmit
创建了一个函数,该函数将把复选框附加到新条目中,并修改了
appendSignatureRow()
的一些部分,并将其用作
onEdit
的函数,以便在选中条目时触发写入Google文档

例子: 表格:

function formSubmit(e){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //get form response sheet
  var col = e.range.getLastColumn();
  var row = e.range.getLastRow();
  sheet.getRange(row, col+1).insertCheckboxes(); // add checkbox
}

function appendSignatureRow(e) {
  var sheetName = e.source.getSheetName(); //get sheet name
  var editedRow = e.range.getRow(); // get edited row number
  var editedCol = e.range.getColumn(); //get editer column number
  if(editedRow > 1 && editedCol == 6 && sheetName == 'Form Responses 1' && e.value == 'TRUE'){
    const lock = LockService.getScriptLock();
    lock.waitLock(30000);
    var sheet = e.source.getSheetByName('Form Responses 1');
    var data = sheet.getRange(editedRow, 1, 1, editedCol -1).getValues()[0]; // get edited row data
    const date = new Date(data[0]).toLocaleDateString(); 
    const name = data[1];
    const affiliation = data[2];
    const country = data[3];

    const tableCells = [name, affiliation, country, date]

    const letter = DocumentApp.openById('Insert Docs ID here')
    const body = letter.getBody();

    const table = body.getTables()[0]
    const tableRow = table.appendTableRow()

    tableCells.forEach(function(cell, index) {
      tableRow.appendTableCell(cell)
    })
    letter.saveAndClose();
    lock.releaseLock();
  }  
}

电子表格数据:

function formSubmit(e){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //get form response sheet
  var col = e.range.getLastColumn();
  var row = e.range.getLastRow();
  sheet.getRange(row, col+1).insertCheckboxes(); // add checkbox
}

function appendSignatureRow(e) {
  var sheetName = e.source.getSheetName(); //get sheet name
  var editedRow = e.range.getRow(); // get edited row number
  var editedCol = e.range.getColumn(); //get editer column number
  if(editedRow > 1 && editedCol == 6 && sheetName == 'Form Responses 1' && e.value == 'TRUE'){
    const lock = LockService.getScriptLock();
    lock.waitLock(30000);
    var sheet = e.source.getSheetByName('Form Responses 1');
    var data = sheet.getRange(editedRow, 1, 1, editedCol -1).getValues()[0]; // get edited row data
    const date = new Date(data[0]).toLocaleDateString(); 
    const name = data[1];
    const affiliation = data[2];
    const country = data[3];

    const tableCells = [name, affiliation, country, date]

    const letter = DocumentApp.openById('Insert Docs ID here')
    const body = letter.getBody();

    const table = body.getTables()[0]
    const tableRow = table.appendTableRow()

    tableCells.forEach(function(cell, index) {
      tableRow.appendTableCell(cell)
    })
    letter.saveAndClose();
    lock.releaseLock();
  }  
}

可安装触发器设置:

function formSubmit(e){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //get form response sheet
  var col = e.range.getLastColumn();
  var row = e.range.getLastRow();
  sheet.getRange(row, col+1).insertCheckboxes(); // add checkbox
}

function appendSignatureRow(e) {
  var sheetName = e.source.getSheetName(); //get sheet name
  var editedRow = e.range.getRow(); // get edited row number
  var editedCol = e.range.getColumn(); //get editer column number
  if(editedRow > 1 && editedCol == 6 && sheetName == 'Form Responses 1' && e.value == 'TRUE'){
    const lock = LockService.getScriptLock();
    lock.waitLock(30000);
    var sheet = e.source.getSheetByName('Form Responses 1');
    var data = sheet.getRange(editedRow, 1, 1, editedCol -1).getValues()[0]; // get edited row data
    const date = new Date(data[0]).toLocaleDateString(); 
    const name = data[1];
    const affiliation = data[2];
    const country = data[3];

    const tableCells = [name, affiliation, country, date]

    const letter = DocumentApp.openById('Insert Docs ID here')
    const body = letter.getBody();

    const table = body.getTables()[0]
    const tableRow = table.appendTableRow()

    tableCells.forEach(function(cell, index) {
      tableRow.appendTableCell(cell)
    })
    letter.saveAndClose();
    lock.releaseLock();
  }  
}

代码:

function formSubmit(e){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //get form response sheet
  var col = e.range.getLastColumn();
  var row = e.range.getLastRow();
  sheet.getRange(row, col+1).insertCheckboxes(); // add checkbox
}

function appendSignatureRow(e) {
  var sheetName = e.source.getSheetName(); //get sheet name
  var editedRow = e.range.getRow(); // get edited row number
  var editedCol = e.range.getColumn(); //get editer column number
  if(editedRow > 1 && editedCol == 6 && sheetName == 'Form Responses 1' && e.value == 'TRUE'){
    const lock = LockService.getScriptLock();
    lock.waitLock(30000);
    var sheet = e.source.getSheetByName('Form Responses 1');
    var data = sheet.getRange(editedRow, 1, 1, editedCol -1).getValues()[0]; // get edited row data
    const date = new Date(data[0]).toLocaleDateString(); 
    const name = data[1];
    const affiliation = data[2];
    const country = data[3];

    const tableCells = [name, affiliation, country, date]

    const letter = DocumentApp.openById('Insert Docs ID here')
    const body = letter.getBody();

    const table = body.getTables()[0]
    const tableRow = table.appendTableRow()

    tableCells.forEach(function(cell, index) {
      tableRow.appendTableCell(cell)
    })
    letter.saveAndClose();
    lock.releaseLock();
  }  
}
输出:

function formSubmit(e){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //get form response sheet
  var col = e.range.getLastColumn();
  var row = e.range.getLastRow();
  sheet.getRange(row, col+1).insertCheckboxes(); // add checkbox
}

function appendSignatureRow(e) {
  var sheetName = e.source.getSheetName(); //get sheet name
  var editedRow = e.range.getRow(); // get edited row number
  var editedCol = e.range.getColumn(); //get editer column number
  if(editedRow > 1 && editedCol == 6 && sheetName == 'Form Responses 1' && e.value == 'TRUE'){
    const lock = LockService.getScriptLock();
    lock.waitLock(30000);
    var sheet = e.source.getSheetByName('Form Responses 1');
    var data = sheet.getRange(editedRow, 1, 1, editedCol -1).getValues()[0]; // get edited row data
    const date = new Date(data[0]).toLocaleDateString(); 
    const name = data[1];
    const affiliation = data[2];
    const country = data[3];

    const tableCells = [name, affiliation, country, date]

    const letter = DocumentApp.openById('Insert Docs ID here')
    const body = letter.getBody();

    const table = body.getTables()[0]
    const tableRow = table.appendTableRow()

    tableCells.forEach(function(cell, index) {
      tableRow.appendTableCell(cell)
    })
    letter.saveAndClose();
    lock.releaseLock();
  }  
}

参考:

如果您希望脚本对电子表格的编辑触发onEdit,那么您需要等待很长时间,因为onEdit只会触发用户编辑。但是,如果您说您希望将数据发布到电子表格,但将写入文档的操作延迟到用户选中复选框之后,那么这将起作用,但您可能需要使用可安装触发器,因为创建和保存新文档需要权限。啊,是的,我希望实现的是后者。我想延迟写入文档的操作,直到用户/管理员选中电子表格中的复选框。但我尝试过可安装的“On Edit”触发器,但没有任何运气——当我在应用程序脚本站点上使用“选择事件类型->On Edit”选项时,绝对不会发生任何事情。onEdit触发器的事件对象中没有事件类型。你自己想想:哇,这正是我所需要的——谢谢@Nikko J。!看起来我需要做更多的工作来指定函数将指向的单元格,以便确定何时触发onEdit。非常感谢。