我有这个简单的脚本:
function myFunction() {
var ssh = SpreadsheetApp.getActiveSpreadsheet();
var ss = ssh.getActiveSheet();
var s = ss.getActiveRange();
var rowIndex = s.getRowIndex();
var colIndex = s.getColumnIndex();
// Get the number of columns in the active sheet.
var colNumber = ss.getLastColumn();
if (colIndex == 1 && rowIndex != 1) {
//Get User Name from inputBox
var name = Browser.inputBox('Owner', 'Enter your Name', Browser.Buttons.OK_CANCEL);
var r1 = ss.getActiveRange().getRow();
//Insert the Name in the active row in the column 6
ss.getRange(r1, 6).setValue(name)
//Here I have other part of the code but is for copy rows to other sheet.
}
}
在第6列中有活动数据验证(不允许插入值不在项目列表中)。 例如:查尔斯,奥斯卡,保罗,其他。如果我输入名称全部为小写,请不要输入。如果输入的值与“Charles”相同,则输入值。
现在,这些值可能会在输入框中显示为下拉列表吗?我的意思是,用户可以从该列表中进行选择,然后按Enter键或确定,并将值插入单元格中。
注意:这不是表格。这是电子表格。
谢谢,
function Historic(e) { //CopyRows
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
if (s.getName() == 'ISP1'){
var r = SpreadsheetApp.getActiveRange();
// Get the row and column of the active cell.
var rowIndex = r.getRowIndex();
var colIndex = r.getColumnIndex();
// Get the number of columns in the active sheet.
var colNumber = s.getLastColumn();
// Move row based on criteria in column 1, and if row is not the header.
if (colIndex == 1 && rowIndex != 1) { // 1 Is the Comment Column
//Call the Function Menu List
showNamePicker();
//Get values for the active row bases on the criteria.
var status = s.getRange(rowIndex, colIndex).getValue();
// --------------- Copy ROW only when someone modify the Column1 --------------------------
// Do nothing if criteria value is not actually changed to something else.
if (s.getName() != 'Historic') {
// The target sheet is the one with the same name as the criteria value.
var targetSheet = ss.getSheetByName('Historic');
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
//=====Copy the Row from ISP1 to Historic=======
s.getRange(rowIndex, 1, 1, colNumber).copyTo(target);
}
}
}
}
function showNamePicker() {
var app = UiApp.createApplication().setHeight(100).setWidth(180);
var handler = app.createServerHandler('setName');
var list = app.createListBox().setName('list').addChangeHandler(handler);
var names = ['Choose a name here','Charles', 'Oscar', 'Paul', 'Other'];
for(var n in names){
list.addItem(names[n]);
}
handler.addCallbackElement(list);
app.add(list);
SpreadsheetApp.getActive().show(app);
}
function setName(e){
var ssh = SpreadsheetApp.getActiveSpreadsheet();
var ss = ssh.getActiveSheet();
var r1 = ss.getActiveRange().getRow();
ss.getRange(r1, 6).setValue(e.parameter.list);
}
功能历史记录:如果有人修改了第1列,脚本会将修改的行中的所有数据复制到历史记录。
需要:
在脚本将行复制到历史记录之前,脚本应该在该行的第6列中插入名称。
问题:
当有人修改第1列时,用户按ENTER键并且新的活动行发生更改,因为它们不相同且脚本未在修改的行中插入名称。 例如: 我修改A2并按ENTER键,新行是A3,脚本将信息插入F3而不是F2。
我尝试在此行之前调用该函数:
//根据条件获取活动行的值。
var status = s.getRange(rowIndex,colIndex).getValue();
但我还是新手......我这很容易,但我无法解决这个问题。
如果你能帮助我,我将不胜感激。
实施例
更改单元格A2 = ID#12578 脚本应该在F2列中插入名称,然后复制所有行,包括名为Historic的表格中的F2。 (脚本未将名称插入F2插入F3
答案 0 :(得分:3)
您必须使用一个对话框替换Browser.inputBox,该对话框将包含一个包含所需值的列表框。
您可以使用UiApp或HTML服务构建此对话框。
问题是没有任何东西可以阻止直接在单元格中输入值,但在您的代码中就是这种情况......
您可以将列表值存储在隐藏列,另一个工作表,另一个电子表格或ScriptProperties或代码本身中的任何位置......这是一个选择问题:-)
编辑:使用UiApp的一个小例子:
function showNamePicker() {
var app = UiApp.createApplication().setHeight(100).setWidth(120);
var handler = app.createServerHandler('setName');
var list = app.createListBox().setName('list').addChangeHandler(handler);
var names = ['Choose a name here','Charles', 'Oscar', 'Paul', 'Other'];
for(var n in names){
list.addItem(names[n]);
}
handler.addCallbackElement(list);
app.add(list);
SpreadsheetApp.getActive().show(app);
}
function setName(e){
var ssh = SpreadsheetApp.getActiveSpreadsheet();
var ss = ssh.getActiveSheet();
var r1 = ss.getActiveRange().getRow();
ss.getRange(r1-1, 6).setValue(e.parameter.list);
return UiApp.getActiveApplication().close();// close the Ui
}