我如何为谷歌表单编写一个代码,将我的字符限制在11个,同时在输入每个新数据时防止重复



这里的想法是,列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));
}
}

最新更新