【发布时间】:2016-05-10 18:16:48
【问题描述】:
我正在处理一个 Google Apps 脚本项目,但我的最后一行代码遇到了问题:
sheets[0].setName(sheet.getRange(i,3).getValue());
脚本采用以电子表格“mysheet”为目标的 Google 表单输入,并根据该输入创建表单。如果第 I (9) 列中没有文本,脚本将触发,构建一个新表单,填写第 9 列,并在当前工作簿中创建一个新的目标电子表格。
这一切都很好。我遇到的问题是最后一个阶段,重命名新创建的电子表格。该脚本要么没有错误就终止,要么我收到一个非描述性的服务代码错误。我基本上需要将新生成的电子表格重命名为表单的名称。我有另一张可以进行 vlookup 的工作表,新工作表的名称不能是随机的“Form Responses #”
我在 Google 的代码系统中发现了这个错误。 https://code.google.com/p/google-apps-script-issues/issues/detail?id=5537
无论如何,对我来说,这描述了正在发生的事情。在项目的早期,该错误导致位置 1 的工作表重命名为系统认为它是 0。我不确定为什么不再发生这种情况。我一定改变了一些东西,但脚本编辑器只返回了大约十几个修订,所以我无法跟踪它。
我想如果我在工作表“mySheet”上强制重置名称:
sheet.setName("mySheet");
它可能会起作用。它确实做到了。从那以后,我添加了更多代码(以下是骨架版本)并且周围的工作不再有效。我又把我的代码删掉了,看看它是不是我添加的东西,但它似乎仍然不起作用。我还尝试将不同的工作表设置为活动工作表,但这似乎也不起作用。
有人有什么建议吗?提前感谢您的想法。
function myFunction() {
var ss = SpreadsheetApp.openById('1gg8FTt_3_Ude5qEmpqlvjZdQocXbYzOKJrgGeLC3cMc');
var sheet = ss.getSheetByName("mySheet");
var range = sheet.getRange("A1:I7");
for (var i = 1; i <= range.getNumRows(); i++) {
var cell = sheet.getRange(i,9).getValue();
if(cell == ''){
var form = FormApp.create(sheet.getRange(i,3).getValue());
var linktoliveform = form.getPublishedUrl();
var contentsforcell = '=HYPERLINK("' + linktoliveform + '","' + sheet.getRange(i,3).getValue() + '")';
sheet.getRange(i,9).setValue(contentsforcell);
form.setCollectEmail(true);
form.setDescription(sheet.getRange(i,4).getValue());
var item = form.addParagraphTextItem();
item.setTitle(sheet.getRange(i,5).getValue());
form.setDestination(FormApp.DestinationType.SPREADSHEET,'1gg8FTt_3_Ude5qEmpqlvjZdQocXbYzOKJrgGeLC3cMc');
//sheet.setName("mySheet"); //reset name on mySheet sheet to force sheets/getsheets list to renumerate. https://code.google.com/p/google-apps-script-issues/issues/detail?id=5537
var sheets = ss.getSheets();
sheets[0].setName(sheet.getRange(i,3).getValue());
}
}
}
【问题讨论】:
-
你检查过 i, 3 返回的值吗?你要重命名同一张表七次,我不知道为什么。
-
嗨乔纳森。是的,i,3 正确地返回了表单应该被调用的名称(微分)。它在我的驱动器中成功创建了表单。循环运行在整个工作表 mysheet 上(我将其限制为 7 个单元格用于这篇文章:它最初是 A1:I)基本上是为了扫描尚未处理的行。因此,如果列中的前三行已经有表单,他们将不会得到新的。
-
在
setName命令之前尝试SpreadsheetApp.flush(),以确保在执行此命令之前实际创建工作表。 -
嗨三明治。那种工作。它会正确地执行第一个,然后脚本将毫无错误地终止。它的运行速度也很慢。今天早上,我为表单创建了一个新的目标电子表格,并为新的电子表格设置了脚本。我能够回到我的 sheet.setname("mysheet") 并删除冲洗。它似乎再次正常工作。我的猜测是某些东西已损坏或工作表因测试而变得臃肿,即使我在运行之间删除了创建的工作表。该脚本现在运行得更快。感谢您的帮助!