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