【问题标题】:Get the last updated CELL in Google sheets and then grab the row. GAS在 Google 表格中获取最后更新的 CELL,然后抓取该行。气体
【发布时间】:2019-02-04 03:04:28
【问题描述】:

所以我有一个 google 表单输入到工作表中,并且从电子表格中,我从模板中制作了 google 文档,其中包含电子表格中的答案。

表单可以在中途保存并稍后通过自定义问题返回,询问他们是否要保存并返回(这会提交表单)。我的电子表格上的脚本激活了 onFormSubmit,所以当他们退出时,模板会用他们一半的答案创建。当他们最终回来完成它时,我希望脚本知道从哪里创建模板。

例如,在它们退出后又添加了 5 行,脚本通过将数字更改为行来手动更改“var strategy”行来创建模板。例如如果我要测试另一个条目,我会先将数字更改为下一个空行,然后在提交表单时,它将使用该行。不实用。它行不通。

我环顾四周,发现 onEdit(e) 但它不起作用,除非它是一个手动条目。

我的问题是,除了 onEdit 还有其他方法可以找到最后一个单元格UPDATED,而不是ADDED,否则它会抓取工作表中的最后一行,即我不想要。如果它抓取最后一个更新的单元格,那么它将抓取正确的行来运行脚本。如果有帮助,我会将我的脚本添加到底部。 ID 等显然已被删除。

有什么想法吗?

function onFormSubmit(e) {

var Sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var headers = Sheets.Spreadsheets.Values.get('myID', 'A1:U1');
var tactics = Sheets.Spreadsheets.Values.get('myID', 'A6:U6');
var templateID = "myID"

for(var i = 0; i < tactics.values.length; i++){

var Timestamp = tactics.values[i][0];
var IDCFREF = tactics.values[i][2];
var raisedby = tactics.values[i][4];
var AccMan = tactics.values[i][6];
var Contrib = tactics.values[i][7];
var Contract = tactics.values[i][8];
var CompName = tactics.values[i][9];
var ValidFrom = tactics.values[i][10];
var ValidTo = tactics.values[i][11];
var Freq = tactics.values[i][12];
var PDetailFreq = tactics.values[i][13];
var BillType = tactics.values[i][14];
var TypeOfRebate = tactics.values[i][15];
var RebateDetails = tactics.values[i][16];
var RTarget = tactics.values[i][17];
var GiveDeets = tactics.values[i][19];
var WhyGiveRebate = tactics.values[i][20];
var documentID = DriveApp.getFileById(templateID).makeCopy().getId();

DriveApp.getFileById(documentID).setName('Rebate ' + IDCFREF + ' Request');

var body = DocumentApp.openById(documentID).getBody();
var header = DocumentApp.openById(documentID).getHeader();

header.replaceText('##IDCF##', IDCFREF)
body.replaceText('##REF##', IDCFREF)
body.replaceText('##RAISED##', raisedby)
body.replaceText('##ACCMAN##', AccMan)
body.replaceText('##CONTRIB##', Contrib)
body.replaceText('##SIGNED##', Contract)
body.replaceText('##NAME##', CompName)
body.replaceText('##FROM##', ValidFrom)
body.replaceText('##TO##', ValidTo)
body.replaceText('##FREQ##', Freq)
body.replaceText('##BESPOKE##', PDetailFreq)
body.replaceText('##BILL##', BillType)
body.replaceText('##TYPE##', TypeOfRebate)
body.replaceText('##DEETS##', RebateDetails)
body.replaceText('##TARGET##', RTarget)
body.replaceText('##FULL##', GiveDeets)
body.replaceText('##ELAB##', WhyGiveRebate)

}
}

【问题讨论】:

  • 给定个人响应的频率是多少?您收到的 sn-p 形式的任何识别信息?此表单是原生 Google 表单,还是以 Google 表单作为响应存储的 HTML 表单?我的想法是,您可以在提前退出时添加带有 uuid 的自定义问题响应,然后找到它。
  • ##REF## 似乎是一个 id。您不能将其用作唯一 ID 吗?
  • @tehhowch2 大家好,##ref## 是一个唯一的 ID,我猜它是识别信息,但是我如何将它添加到脚本中以便它知道要转到哪一行.我需要它,以便在编辑任何旧表单时,脚本将知道在工作表上的何处获取模板文档的信息,而不是我手动更改行或使用工作表中的最后一行。这是一个原生的谷歌表单。

标签: google-apps-script google-sheets google-docs google-forms


【解决方案1】:

因此,对于遇到相同问题的任何人,这是我的解决方案:

function onFormSubmit(e) {

var range = e.range;
var ss = range.getSheet();
var row = range.getRowIndex();

var tactics = Sheets.Spreadsheets.Values.get('ID', "A:AQ"+row);

它的工作方式是删除表单响应表中的每一行,直到最后一个条目,然后瞧。 ("A:AQ"+row) 在表单提交时从 'e.range' 创建的变量 'row' 中获取行索引。

它对我很有用,如果在另一个人回来编辑他的回复之前填写了 3 个表格并在工作表中添加了 3 行,脚本就知道在工作表中的哪一行找到数据,从而创建正确的模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2014-05-09
    • 1970-01-01
    • 2012-10-06
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多