Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何使用datavalidation自动填充单元格而不更改Google工作表上的整行?_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 如何使用datavalidation自动填充单元格而不更改Google工作表上的整行?

Google apps script 如何使用datavalidation自动填充单元格而不更改Google工作表上的整行?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在自动化我公司的预约流程,我已经成功地实现了一些带有时间触发器的谷歌脚本。 每当有人在Calendally上预约时,它都会通过Zapier创建带有多个信息的at行。 然后,我有一个脚本,其中有几个函数可以对新添加的行进行操作。 一个函数根据日期列自动排序新行,然后另外两个函数使用复选框(FALSE)和基于选择列表的数据验证填充两列。所有这些功能都是时间触发的,比如说30分钟。 问题是,每当触发发生时,它都会自动为整个列选中复选框TRUE,并为整个datavalidation列选中列表的第一个

我正在自动化我公司的预约流程,我已经成功地实现了一些带有时间触发器的谷歌脚本。 每当有人在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);

}

非常感谢你的解释,这确实更有意义。我不知道我正在使用的每个函数的所有组件。我可以确认它现在工作得完美无缺!非常感谢你的解释,这确实更有意义。我不知道我正在使用的每个函数的所有组件。我可以确认它现在工作得完美无缺!