如何制作一个 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 可用值。
如果您有任何错误,或需要进一步解释,请告诉我!
很抱歉提出这个问题,但我不是真正的软件开发人员,也不熟悉 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 可用值。
如果您有任何错误,或需要进一步解释,请告诉我!