这里的想法是,列A中的每个单元格都必须是11位数字,不能多也不能少,并且在输入数据的任何时候都不能有任何重复,这样重复的条目就会被拒绝。我尝试使用数据验证,但我注意到我只能应用一个数据验证规则。我曾想过使用谷歌应用程序脚本,但我对编程还是个新手。易马奇对谷歌sheetour的协助表示高度赞赏。
function myDatavalidation() {
var Len=('B1:B')=11
var range = SpreadsheetApp.getActive().getRange('B1:B')
var validation = SpreadsheetApp.newDataValidation().requireFormulaSatisfied(Len);
range.setDataValidation(validation)
}
我相信您的目标如下。
- 当一个值被放入列";B";,您想检查输入的值是否是11的长度并且在列"0"中重复;B";。当输入的值不是长度11或在列"0"中重复时;B";,你不想输入它
- 你想使用谷歌应用程序脚本来实现这一点
在这种情况下,下面的示例脚本如何?
修改的脚本:
请将以下脚本复制并粘贴到电子表格的脚本编辑器中,然后保存该脚本。当您运行此脚本时,请编辑列";B";";Sheet1";(在此示例中(。通过这种方式,脚本由一个简单的触发器运行。
function onEdit(e) {
const sheetNames = ["Sheet1"]; // Please set the sheet names you want to run the script.
const range = e.range;
const sheet = range.getSheet();
if (!sheetNames.includes(sheet.getSheetName()) || range.columnStart != 2) return;
const value = range.getDisplayValue();
const values = sheet.getRange("B1:B" + sheet.getLastRow()).getDisplayValues().map(([b]) => b);
values.splice(range.rowStart - 1, 1);
if (value.length != 11 || values.includes(value)) {
range.clearContent();
}
}
注:
- 此脚本由OnEdit的简单触发器运行。因此,当您直接运行此脚本时,会出现类似
TypeError: Cannot read property 'range' of undefined
的错误。请小心
参考:
- 简单触发器
我发现这篇文章有关于如何消除范围中的重复的应用程序脚本代码
/**
* remove duplicate rows from Google Sheets data range
*/
function removeDupRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet1');
// change the row number of your header row
var startRow = 7;
// get the data
var range = sheet.getRange(startRow,1,sheet.getLastRow(),sheet.getLastColumn()).getValues();
// remove duplicates with helper function
var dedupRange = arrayUnique(range);
Logger.log(dedupRange);
// check if duplicate sheet exists already, if not create new one
if (ss.getSheetByName('Sheet1 Duplicates Removed')) {
// case when dedup sheet already exists
var dedupSheet = ss.getSheetByName('Sheet1 Duplicates Removed');
var lastRow = Math.max(dedupSheet.getLastRow(),1);
var lastColumn = Math.max(dedupSheet.getLastColumn(),1);
// clear out any previous de-duplicate data
dedupSheet.getRange(1,1,dedupSheet.getLastRow(),dedupSheet.getLastColumn()).clear();
// replace with new de-duplicated data
dedupSheet.getRange(1,1,dedupRange.length,sheet.getLastColumn()).setValues(dedupRange);
}
else {
// case when there is no dedup sheet
var dedupSheet = ss.insertSheet('Sheet1 Duplicates Removed',0);
dedupSheet.getRange(1,1,dedupRange.length,dedupRange[0].length).setValues(dedupRange);
}
// make the de-duplicate sheet the active one
dedupSheet.activate();
}
/**
* helper function returns unique array
*/
function arrayUnique(arr) {
var tmp = [];
// filter out duplicates
return arr.filter(function(item, index){
// convert row arrays to strings for comparison
var stringItem = item.toString();
// push string items into temporary arrays
tmp.push(stringItem);
// only return the first occurrence of the strings
return tmp.indexOf(stringItem) >= index;
});
}
这个功能可以帮助你限制活动单元格中的字符数:
function onEdit(e) {
var limit = 5;
if(e.value.length > limit) {
e.range.setValue(e.value.substring(0, limit) + "...");
e.range.setNote("Remaining text was: n....." + e.value.substring(limit));
}
}