【问题标题】:Format google Form answer to be text instead of number?将谷歌表单答案格式化为文本而不是数字?
【发布时间】:2021-01-21 00:55:59
【问题描述】:

我有一个编号系统,它按照以下结构工作:000A00(其中前三位数字代表一年中的日期,“A”代表年份字母(我目前在“E”年)和最后两位数字代表产品的修订号。

这个号码是在谷歌表单中作为答案提交的。但是,我们遇到了当前年份字母为“E”的问题......因为现在答案不是被视为文本(如我所愿),而是认为它是一个带有科学记数法的数字。 因此,例如,它不是 015E01,而是转换为 1.50E+02,这就是响应表中显示的内容。有关如何使其显示为原始的任何建议文字??

我已尝试更改相应列的格式。如果您将格式更改为纯文本,然后在工作表上键入文本,则它将保留为文本。但是,当发生表单提交时,似乎插入了一行并且不采用列的格式。事后更改格式似乎也无法将其恢复为原始文本。

欢迎提出建议,包括解决问题的脚本。但是,请记住,我正在运行数百个这样的表格,每个表格都有几个问题需要这种类型的响应结构,并且问题的数量和问题编号(以及响应表中的相应列)在每个表格。

这显然只是一个问题,现在年份字母为“E”,我有数百个前几年的条目,一切都很好。

【问题讨论】:

  • 最简单的解决方案可能是在您的响应表中有一个额外的列来强制转换为文本 - 但您不想为数百个表单这样做。然后可能是一个 onFormSubmit 脚本来强制转换,但即使将其部署到数百个表单也可能很耗时。最后,一个脚本可以读取所有响应表,并将转换列添加到它们?但是,如果每个表单中的列发生变化,那么自动化也可能具有挑战性 - 您的日期列/字段是否可以按名称识别,否则按内容搜索?只是抛出想法......

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


【解决方案1】:

我能够复制您的问题并创建一个可能为您指明正确方向的脚本。请参阅我的example form herecorresponding spreadsheet here。突出显示的列显示从表单发送的修改后的响应值(请随意发送虚假条目进行测试)。

它所做的只是将表单响应值传递给特定项目(即文本),然后将其作为文本公式插入,例如 ="015E01"

这是我使用的代码,其中包括更新所有条目,以及如果您想尝试调整追溯成员。确保在标题中使用适当的电子表格 ID 和常量更新您的代码。

const thisForm = FormApp.getActiveForm();
const theQuestion = thisForm.getItemById(21944463) //<--- change this to your question number
const ss = SpreadsheetApp.openById(thisForm.getDestinationId()).getActiveSheet();
//runs on submissiong
  //Make sure to enable as a trigger
  function onEntry(e) {
    addTextValue(e.response);
  }

//fixes all responses
function fixAllValues() {
const entryPoint = "E2"; //set where you want to insert new values
var theCollectedReplies = [];
var allReplies = thisForm.getResponses();
for (var i = 0; i < allReplies.length; i++) {

  var theValue = allReplies[i].getResponseForItem(theQuestion).getResponse();
  theCollectedReplies.push(['"' + theValue + '"']);
}
ss.getRange(ss.getRange(entryPoint).getRow(), ss.getRange(entryPoint).getColumn(), 
  theCollectedReplies.length, 1).setFormulasR1C1(theCollectedReplies);
}


//Add values when resposnses are submited
  function addTextValue(theResponse) {
    const theColumnOfData = 4 //where to put new entry
    var theValue = theResponse.getResponseForItem(theQuestion).getResponse();

    ss.getRange(ss.getLastRow(), theColumnOfData).setFormulaR1C1('"' + theValue + '"');
  }

【讨论】:

  • 这很棒,已经帮了我不少忙。我什至不知道可以通过将工作表 ID 作为表单目标工作表来使工作表 ID 动态化。唯一的问题是它创建了一个新列,而不是覆盖答案列中的数据。本质上,我从不希望它在工作表的任何地方都有“错误”的数据。这些工作表由数据库系统使用,如果使用这种科学记数法而不是“文本编号”会导致错误。我想我可以尝试指向原始答案的列号,看看它是否会覆盖。我会玩一会儿。
  • 我猜也仍然难以实施......因为每个表格都有需要实施的各种问题(必须确定每个表格的问题编号)。将所有答案转换为文本可能有效,但再次需要它来覆盖工作表中的答案,而不是创建新列。有些答案是实际数字,不确定将它们转换为文本会导致数据库出现问题,但可能不会。
  • onEntry(e) 似乎没有作为一个简单的触发器运行?不过,我从来没有真正使用过简单的触发器,所以不确定我是否遗漏了一些东西。我刚刚添加了一个手动触发器来在“表单提交”上运行该功能......但是肯定可以忽略该功能而只是触发 addTextValue 功能?我想我在这里遗漏了一些东西。
  • @PGSystemTester 我可以知道如何获取问题编号吗?
  • @Kelvin .getItemId() 或发布您的问题,包括此处的链接。
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 2020-05-07
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多