我正在重新创建和扩展我以前做过的一个文档。我已经把我最初使用的脚本带来了,并在我认为适合在这张纸上工作的地方对它进行了修改,但我肯定遗漏了什么。所涉及的3个电子表格文件的可编辑示例可以找到这里。这些文件是一个示例“价格表”、“目录”(它从所有价格表中聚合制造商名称,并有一个"Catalog“选项卡用于我的主要供应商未出售的misc项目)和”增编B“,这是我需要帮助的文件。
本文件是我的合同的增编,其中列出了作为该合同一部分出售的所有设备。它有两个活页(“增编B”和"XREF"),“增编B”有几个相关栏:供应商、制造商、型号、描述和价格。它们的依赖关系如下:
目前正在工作
不工作,脚本在文件中
如果这件事比我以前做的更棘手的话。
这点总结了我的目标和我所奋斗的事情。
发布于 2017-03-14 23:59:10
因此,我在中查看了您的脚本文件。我做了很少的编辑,现在应该可以工作了,修改后的代码:
function onEdit()
{
var ss = SpreadsheetApp.getActiveSpreadsheet(),
sheet = ss.getActiveSheet(),
name = sheet.getName();
if (name != 'Addendum B') return;
var range = sheet.getActiveRange(),
col = range.getColumn();
if (col != 6) return; //You col was set to 5 changed it to 6!
var val = range.getValue(),
dv = ss.getSheetByName('XREF'),
data = dv.getDataRange().getValues(),
catCol = data[0].indexOf(val),
list = [];
Logger.log(catCol)
for (var i = 1, len = 100; i < len; i++) // Problem is here, you have too many items in list! Cannot have more 500 items for validation
list.push(data[i][catCol]);
var listRange = dv.getRange(2,catCol +1,dv.getLastRow() - 1, 1)
Logger.log(list)
var cell = sheet.getRange(range.getRow(), col-1)
var rule = SpreadsheetApp.newDataValidation()
.requireValueInRange(listRange) // Use requireValueIn Range instead to fix the problem
.build();
cell.setDataValidation(rule);
Logger.log(cell.getRow())
}验证不起作用的原因是数据验证列表中有500多项。我只是把它修改成从范围取相同的值。希望你觉得这有帮助!
至于其余的3个问题,以下是我对此的意见和想法:
1)我没有发现任何与你在问题中提到的问题有关的代码。所以,我假设你是在问关于如何实现这一目标的一般想法?
2)基本上,您处理问题的方式与处理上面的代码相同!选择制造商后,脚本将在工作表中查找该制造商,并在相应的模型列中更新数据验证。您将修改代码如下
var ss = SpreadsheetApp.openById("1nbCJOkpIQxnn71sJPj6X4KaahROP5cMg1SI9xIeJdvY")
//The above code with select the catalog sheet.
dv = ss.getSheetByName('Misc_Catalog')
//The above code will open the Misc_Catalog tab. 3)更好的方法是使用Sidebar/Dialog Box验证输入,然后将其添加到最后的工作表中。(看起来更干净,也可以防止不必要的编辑触发器在工作表中,这可能需要一段时间来更新。)您可以在这里找到更多详细信息:https://developers.google.com/apps-script/guides/dialogs
https://stackoverflow.com/questions/42797403
复制相似问题