如何制作一个 google 应用程序脚本,该脚本在分离 sheet 时从列中获取随机值

How to make a google apps script that takes a random value from a column when out separate sheet

很抱歉提出这个问题,但我不是真正的软件开发人员,也不熟悉 java。几天来我一直在为这个问题苦苦挣扎,最后期限快到了……所以我希望能得到一些帮助。已经非常感谢了!!

我要找的是: 我有一个链接到 Google Spreadsheet 的 Google 表格。所以 google 形式的每个答案都会转到那个 spreadsheet。这些答案在 google 应用程序脚本中用于创建 google 文档文件(基于表单的答案)。

现在在 Google 表格中,有一些 Yes/No 问题。当他们在第一个问题上选择“是”时,其想法是 google 应用程序脚本采用(单独的)“答案”sheet.

第一列的随机单元格

当他们在第二个问题上选择“是”时,其想法是 google 应用程序脚本会随机选择“答案”sheet 第二列的单元格。等等。

当他们在某个问题上选择“否”时,不需要发生任何事情。

稍后,这些随机选择的answers/cells也需要放在googlesheet中。 (如姓名和电子邮件)

我会展示我现在拥有的东西:

function autoFillGoogleDocFromForm(e) {
  var Timestamp = e.values[0];
  var Name = e.values[1];
  var Email1 = e.values[2];
  var OpenQuestion = e.values[3];
  var YesNoQuestion1 = e.values[4];
  var YesNoQuestion2 = e.values[5];
  var YesNoQuestion3 = e.values[6];

var TemplateResponseFolder = DriveApp.getFolderById("Unique-folder-ID");
var copy = TemplateFile.makeCopy(Name, TemplateResponseFolder);

var doc = DocumentApp.openById(copy.getId());
var body = doc.getBody();

// replace the value between {{xyz}} by the variable in the google doc.
body.replaceText("{{Name}}", Name);
body.replaceText("{{AchterNaam}}", LastName);
body.replaceText("{{email1}}", Email1);
body.replaceText("{{OpenQuestion}}", OpenQuestion);
body.replaceText("{{YesNoQuestion1}}", YesNoQuestion1);
body.replaceText("{{YesNoQuestion2}}", YesNoQuestion2);
body.replaceText("{{YesNoQuestion3}}", YesNoQuestion3);

  doc.saveAndClose();
}
// the script above works fine.

但我真的不知道如何使“随机查找功能”起作用并将该值存储为变量以在 google 文档中使用它。 我一直在尝试:

function selectRandomCell(searchColumn,resultCellRow,resultCellColumn) {
  var ss = SpreadsheetApp.openById("Unique-ID-of-the-answer-sheet");
  var range = ss.getSheetByName("Sheet1").getRange("A1:A").getValues();
  var values = [];
  
  for (var i = 0; i < range.length; i++) {
    if (range[i][0] == "") {
      continue;
    }
    else {
      values.push(range[i][0]);
    }
  }

  return values[Math.floor(Math.random() * values.length)]);
}

请帮助我。 (对不起我的英语)

解决方案:

function autoFillGoogleDocFromForm(e) {
  var Timestamp = e.values[0];
  var Name = e.values[1];
  var Email1 = e.values[2];
  var OpenQuestion = e.values[3];
  var YesNoQuestion1 = (e.values[4] === `Yes`) ? selectRandomCell(1) : `No`;
  var YesNoQuestion2 = (e.values[5] === `Yes`) ? selectRandomCell(2) : `No`;
  var YesNoQuestion3 = (e.values[6] === `Yes`) ? selectRandomCell(3) : `No`;

  var TemplateResponseFolder = DriveApp.getFolderById("Unique-folder-ID");
  var copy = TemplateFile.makeCopy(Name, TemplateResponseFolder);

  var doc = DocumentApp.openById(copy.getId());
  var body = doc.getBody();

  // replace the value between {{xyz}} by the variable in the google doc.
  body.replaceText("{{Name}}", Name);
  body.replaceText("{{AchterNaam}}", LastName);
  body.replaceText("{{email1}}", Email1);
  body.replaceText("{{OpenQuestion}}", OpenQuestion);
  body.replaceText("{{YesNoQuestion1}}", YesNoQuestion1);
  body.replaceText("{{YesNoQuestion2}}", YesNoQuestion2);
  body.replaceText("{{YesNoQuestion3}}", YesNoQuestion3);

    doc.saveAndClose();
}

function selectRandomCell(targetColumn) {
  const answerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(`NAME_OF_YOUR_ANSWER_SHEET`);
  const values = answerSheet.getRange(2, targetColumn, answerSheet.getLastRow()-1)
                            .getDisplayValues()
                            .flat()
                            .filter(String);

  return values[Math.floor(Math.random() * values.length)];
}
  • 第一个变化是确定 Yes/No 响应是什么。

我们将此实现为 (e.values[4] === 'Yes') ? selectRandomCell(1) : 'No',转换为 (is this value 'Yes'?) If so, get a random cell from column 1. If not, leave it as 'No'

  • 第二个变化是简化 selectRandomCell 函数。

根据您输入的列号,该函数将随机获取该列的所有值和 select 一个值,然后 return 返回给我们。如果这个函数在我们的 YesNoQuestion 变量中是 'called',那么这个函数的结果就是那个变量的值。

您需要做的事情:

  • 创建或更新 sheet 您希望从中 'Yes' 回答的 select。这个 sheet 的名字应该在这个 Spreadsheet 中并且 sheet 的名字必须替换 selectRandomCell() 函数中的 NAME_OF_YOUR_ANSWER_SHEET
  • 如果您不打算使用 A、B、C 列(1、2、3),请将 'passed' 中的数字更新为 [=14= 的 selectRandomCell() 函数中的数字] 变量以匹配相应的列。另请注意,selectRandomCell 函数还期望第一行是 select 可用值。

如果您有任何错误,或需要进一步解释,请告诉我!