如果源随后更改,如何更新从下拉单元格中选择的内容? (插入单元格引用而不是文字值。)

时间:2015-10-19 06:45:47

标签: google-sheets

我有两张纸用于跟踪建筑项目。

在第一张表格中,任务列表包含在时间表中,其中包含成本预测等。任务类似于以下内容:

  • 切割混凝土
  • 倒新垫
  • 车顶

第二张纸用于跟踪单个购买,每个购买与来自第一张纸的任务(例如,切割混凝土)相关联。它看起来像下面这样:

DATE   PAYEE       ITEM        CATEGORY   COST
-----  ----------  ----------  --------   ------
10/25  Home Depot  (10) 2x4's  Frame  ▽   $54.00

使用数据验证,第二个工作表中的“类别”下拉列表引用第一个工作表中的项目列表。这很完美。这是问题......

如果我更改第一张纸上的项目(例如,“Frame”为“Framing”),虽然下拉列表已更新,但任何先前输入的行(如上图所示)只显示验证错误(即,细胞右角的红色指示器)。

由于建筑项目可以轻松购买数百个项目,而非手动查找数据验证错误,是否有办法更新第二个工作表的值?例如......

  1. 添加一个脚本,用于监视第一个工作表中的内容更改。当用户开始编辑“任务”单元格时,会记录其原始值;退出单元格后,如果值已更改,脚本将在第二个电子表格中查找原始值,并将其替换为新值。 (好像很麻烦。)
  2. 找到下拉列表的一些方法,将单元格引用插入第一个工作表而不是实际值。这样,下拉单元格始终引用源项目(即“任务”单元格的当前内容)。
  3. 一个我不知道的更明显的特征。

2 个答案:

答案 0 :(得分:1)

根据我在问题中提到的我喜欢的可能性,我想出了如何编写一个在从下拉列表中选择值后运行的脚本,从而用单元格引用覆盖文字值。

用户在下拉菜单中进行选择后,将运行以下脚本:

function onEdit(event){
    var activeSheet = event.source.getActiveSheet();
    var activeSheetName = activeSheet.getName();

    var activeCell = activeSheet.getActiveCell();
    var activeColumn = activeCell.getColumn();

    if (activeSheetName == "Envelope (Spent)" && activeColumn === 4) {
        var destinationCell = activeCell;
        var destinationContent = destinationCell.getValue();

        var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
        var sourceSheetName = sourceSheet.getName();
        var sourceRange = sourceSheet.getRange("D:D");
        var sourceValues = sourceRange.getValues();

        for (var i = 0; i < sourceValues.length; i++) {
            if (sourceValues[i] == destinationContent) {
                var sourceRow = sourceSheet.getRange("D" + i + ":D" + i).getRow() + 1;
                destinationCell
                    .setValue("='" + sourceSheetName + "'!D" + sourceRow)
                    .setNote(destinationContent)
                ;
            }
        }
    }
}

为了便于在两张纸以某种方式不同步的情况下进行恢复,将从下拉列表的数据验证中导出的原始选择值作为注释插入。我认为将来清除所有笔记要比发现自己有一堆与任务来源列表不对应的条目更容易。

答案 1 :(得分:0)

Google表格中的数据验证始终会插入您输入或选择的文字,以便您无法将其链接到原始单元格。你必须通过脚本解决整个问题

  1. 通过onOpen()
  2. 获取所有数据验证项的列表
  3. 创建一个onEdit()函数,该函数在编辑数据验证范围时运行,检查哪个字段已更改然后完成购买,检查哪些购买具有旧值并将其替换为新值。