Google apps script 如何使用datavalidation自动填充单元格而不更改Google工作表上的整行?
我正在自动化我公司的预约流程,我已经成功地实现了一些带有时间触发器的谷歌脚本。 每当有人在Calendally上预约时,它都会通过Zapier创建带有多个信息的at行。 然后,我有一个脚本,其中有几个函数可以对新添加的行进行操作。 一个函数根据日期列自动排序新行,然后另外两个函数使用复选框(FALSE)和基于选择列表的数据验证填充两列。所有这些功能都是时间触发的,比如说30分钟。 问题是,每当触发发生时,它都会自动为整个列选中复选框TRUE,并为整个datavalidation列选中列表的第一个选项。 我怎样才能解决这个问题Google apps script 如何使用datavalidation自动填充单元格而不更改Google工作表上的整行?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在自动化我公司的预约流程,我已经成功地实现了一些带有时间触发器的谷歌脚本。 每当有人在Calendally上预约时,它都会通过Zapier创建带有多个信息的at行。 然后,我有一个脚本,其中有几个函数可以对新添加的行进行操作。 一个函数根据日期列自动排序新行,然后另外两个函数使用复选框(FALSE)和基于选择列表的数据验证填充两列。所有这些功能都是时间触发的,比如说30分钟。 问题是,每当触发发生时,它都会自动为整个列选中复选框TRUE,并为整个datavalidation列选中列表的第一个
var SORT_COLUMN_INDEX = 4;
var ASCENDING = true;
var NUMBER_OF_HEADER_ROWS = 1;
var activeSheet;
function autoSort() {
console.log(sheet, activeSheet)
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getDataRange();
if (NUMBER_OF_HEADER_ROWS > 0) {
range = range.offset(NUMBER_OF_HEADER_ROWS, 0);
}
range.sort( {
column: SORT_COLUMN_INDEX,
ascending: ASCENDING
} );
}
// Fonction to automatically add data validation in column K
function setDataValidationComing() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var listOfChoices = ["Coming","Not Coming","Message Left", "Unreachable"]
var validation = SpreadsheetApp.newDataValidation().requireValueInList(listOfChoices).build();;
sheet.getRange("K2").setDataValidation(validation);
var lr = sheet.getLastRow();
var fillDownRange = sheet.getRange(2, 11, lr-1);
sheet.getRange("K2").copyTo(fillDownRange);
}
// Fonction to automatically add checkbox for appointment honored in column L
function setCheckboxCame() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var validation = SpreadsheetApp.newDataValidation().requireCheckbox().build();
sheet.getRange("L2").setDataValidation(validation);
var lr = sheet.getLastRow();
var fillDownRange = sheet.getRange(2, 12, lr-1);
sheet.getRange("L2").copyTo(fillDownRange);
}
这是谷歌表单的截图
谢谢你的帮助,我一周前才开始使用谷歌脚本
问题是,每当触发发生时,它都会自动为整个列选中复选框TRUE,并为整个datavalidation列选中列表的第一个选项
对于整个列,它实际上并没有将其检查为true。它复制标题后第一行的值,并将该值应用于列中的每个复选框。第一行数据显示“Coming”,因此如果运行该脚本,它将应用于所有数据。如果您将其更改为“notcoming”,它将对每一行应用“notcoming”。这是因为这一行:sheet.getRange(“K2”).copyTo(fillDownRange)代码>
您不想复制K2的值,只想复制验证。所以这条线应该是:
`sheet.getRange("K2").copyTo(fillDownRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);`
至于复选框,这有点棘手,但同样的概念适用:
function setCheckboxCame() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
// UPDATED THIS PART
var validation = SpreadsheetApp.newDataValidation().requireCheckbox();
validation.setAllowInvalid(false);
validation.build();
var lr = sheet.getLastRow();
var fillDownRange = sheet.getRange(2, 12, lr-1);
// CHANGE THIS:
//sheet.getRange("L2").copyTo(fillDownRange);
// TO THIS:
fillDownRange.setDataValidation(validation);
}
问题是,每当触发发生时,它都会自动为整个列选中复选框TRUE,并为整个datavalidation列选中列表的第一个选项
对于整个列,它实际上并没有将其检查为true。它复制标题后第一行的值,并将该值应用于列中的每个复选框。第一行数据显示“Coming”,因此如果运行该脚本,它将应用于所有数据。如果您将其更改为“notcoming”,它将对每一行应用“notcoming”。这是因为这一行:
sheet.getRange(“K2”).copyTo(fillDownRange)代码>
您不想复制K2的值,只想复制验证。所以这条线应该是:
`sheet.getRange("K2").copyTo(fillDownRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);`
至于复选框,这有点棘手,但同样的概念适用:
function setCheckboxCame() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
// UPDATED THIS PART
var validation = SpreadsheetApp.newDataValidation().requireCheckbox();
validation.setAllowInvalid(false);
validation.build();
var lr = sheet.getLastRow();
var fillDownRange = sheet.getRange(2, 12, lr-1);
// CHANGE THIS:
//sheet.getRange("L2").copyTo(fillDownRange);
// TO THIS:
fillDownRange.setDataValidation(validation);
}
非常感谢你的解释,这确实更有意义。我不知道我正在使用的每个函数的所有组件。我可以确认它现在工作得完美无缺!非常感谢你的解释,这确实更有意义。我不知道我正在使用的每个函数的所有组件。我可以确认它现在工作得完美无缺!