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 函数的作用是:将下拉列表视为单元格内容,即使下拉列表为空_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 函数的作用是:将下拉列表视为单元格内容,即使下拉列表为空

Google apps script 函数的作用是:将下拉列表视为单元格内容,即使下拉列表为空,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我试图使用脚本函数appendrow()将行移动到具有下拉列表和复选框数据验证的工作表中(数据验证也存在于源工作表中,并镜像目标工作表的数据验证)。我遇到的问题是,在目标工作表的第1000行一直追加行。当我删除下拉列表时,它会正确地追加行。但我需要数据验证,以防需要对这些单元格进行更改。数据验证应用于多个列(例如F2:F) 我需要知道如何在标题后插入行,因为根据appendrow()函数,下拉列表和复选框显然被视为内容 当前脚本: function onEdit(e) { var ss = e

我试图使用脚本函数appendrow()将行移动到具有下拉列表和复选框数据验证的工作表中(数据验证也存在于源工作表中,并镜像目标工作表的数据验证)。我遇到的问题是,在目标工作表的第1000行一直追加行。当我删除下拉列表时,它会正确地追加行。但我需要数据验证,以防需要对这些单元格进行更改。数据验证应用于多个列(例如F2:F)

我需要知道如何在标题后插入行,因为根据appendrow()函数,下拉列表和复选框显然被视为内容

当前脚本:

function onEdit(e) {

var ss = e.source,
sheet = ss.getActiveSheet(),
    range = e.range,
    targetSheet,
    columnNumberToWatch = 14;
if (sheet.getName() === "Pending Bookings" && e.value === "CONFIRMED" && 
e.range.columnStart === columnNumberToWatch) {
    targetSheet = "Confirmed Bookings"
} else if (sheet.getName() === "Confirmed Bookings" && e.value === "" && 
e.range.columnStart === columnNumberToWatch) {
    targetSheet = "Pending Bookings"
}
ss.getSheetByName(targetSheet)
.appendRow(sheet.getRange(e.range.rowStart, 1, 1, sheet.getLastColumn())
.getValues()[0])
sheet.deleteRow(e.range.rowStart);
}

使用验证列追加行

function AppendingARow() {
  var sh=SpreadsheetApp.getActiveSheet();
  var vA=sh.getRange(2,1,sh.getMaxRow()-1,1).getValues();//save the validation
  sh.getRange(2,1,sh.getMaxRows()-1,1).clear();//clear the validation
  var vB=sh.getRange(2,3,sh.getMaxRows()-1,1).getValues();
  sh.getRange(2,3,sh.getMaxRows()-1,1).clear();
  sh.appendRow(['','Yes','','Maybe','No Way', 'Come back tommorow and try again']);//append the row
  sh.getRange(2,1,vA.length,1).setValues(vA);//restore the validation
  sh.getRange(2,3,vB.length,1).setValues(vB);
}
以下是我的电子表格:

我把它放在一个函数中:

function AppendRow(cA,rowA,tsh) {
  var cObj={cA:[]};
  cObj.cA=cA;
  cObj.cA.forEach(function(c){
    cObj[c]=tsh.getRange(2,c,tsh.getMaxRows(),1).getValues();//save validations
    tsh.getRange(2,c,tsh.getMaxRows(),1).clear();//clear validation
  });
  cObj.lr=tsh.getLastRow();//get and save last row
  cObj.cA.forEach(function(c){
    tsh.getRange(2,c,cObj[c].length,1).setValues(cObj[c]);//return validations        
  });
  tsh.getRange(cObj.lr+1,1,1,rowA.length).setValues([rowA]);//Insert new row. This approach preserves the values in the inserted row
}
cA是验证数据列的数组

rowA是您试图附加的行。这是一个一维数组

tsh是目标


我在我的简单示例中对此进行了测试,但让我们看看在您的示例中会发生什么。

您可以通过更智能的
范围选择将数据从一张表移动到另一张表来实现这一点

用这样一张纸:

您可以使用脚本:

function appendWithValidation() {
  var source = SpreadsheetApp.getActive().getSheetByName("Source");
  var destination = SpreadsheetApp.getActive().getSheetByName("Destination");

  var newData = source.getDataRange().getValues();

  while (destination.getDataRange().getValues().length>destination.getMaxRows()) {
    destination.deleteRow(destination.getMaxRows());
  }

  for (var i=0; i<newData.length; i++) {
    destination.appendRow(newData[i]);
  }

  source.getDataRange().clear();
}
函数appendWithValidation(){
var source=SpreadsheetApp.getActive().getSheetByName(“源”);
var destination=SpreadsheetApp.getActive().getSheetByName(“目的地”);
var newData=source.getDataRange().getValues();
while(destination.getDataRange().getValues().length>destination.getMaxRows()){
destination.deleteRow(destination.getMaxRows());
}

对于(var i=0;iI在第一列中有一个数据验证规则,我可以这样附加行:
函数appendRow(){SpreadsheetApp.getActiveSheet().appendRow(['','Yes','Maybe','No-way','Come-tomorw,然后重试'])
,只要验证处于默认状态(即未选择任何内容),就没有任何问题。如果在底部附近选择了一个,那么下一行就是追加的开始。谢谢@Cooper。有没有办法使用我拥有的脚本集成该方法,或者我必须完全重新考虑它?(添加以供参考)哪些列进行了验证?1、3、4、5、6、7、14、15 targetsheet是否有任何标题?注意:我的第一个函数是使用getMaxColumns(),而它本应该是getMaxRows()…我很惊讶它居然能工作。