如何使用脚本自动填充 Google 电子表格单元格

问题描述 投票:0回答:1

是否有一种方法可以在将新项目设置(添加)到数据库时自动填充电子表格中的新单元格,以最大限度地减少数据输入和管理时间?

如果我没有正确解释自己,电子表格新手,请提前道歉。

例如:当从主 FC 中放入一个新项目时:数据库,第 498 行。 screenshot of database

是否可以自动填充第 151 行的 FC:Master Gantt?无需手动输入单元格的方程式screenshot of master gantt 以及更新 FC:第 122 行的项目时间表 B?screenshot of timeline b

电子表格副本如下: https://docs.google.com/spreadsheets/d/18oPsXqN8fvSstcupNlzyWeX0edDi3pHl0glh7fZi6Do/edit?usp=share_link

我正在尝试为我们的车间创建一个最适合我们的操作系统,而不是购买可能无法涵盖我们处理工作方式的软件。 我做了一些研究,看起来可能涉及一些编码脚本。我对 HTML 和 Javascripts 有一些了解。但严重依赖观看 youtube 并向谷歌社区寻求助手。感谢您的帮助。

谢谢!

我还没试过

google-apps-script google-sheets google-drive-api google-workspace-add-ons
1个回答
0
投票

请将此答案视为在各种工作表之间建立链接的方法的基础。

答案分为两部分:

  • 重新设计甘特图母版以在单元格中插入公式(如下所述/所示)。这些公式包括对 C 列中项目编号的相对引用,并将根据该编号计算值。这使用户能够简单地复制/粘贴甘特图的九行表来创建一个新项目。这些公式使用索引/匹配函数来创建对数据库中值的动态引用。
  • 一个'onEdit(e)'函数,用于检查数据库中的编辑,在L列和值=“TRUE”(基于复选框)。如果为真,则脚本会在甘特图主视图的项目编号单元格中创建/插入一个公式。此公式引用数据库的编辑行。 在甘特图主图的 C 列中创建项目编号后,所有索引/匹配公式都会引用该值并从数据库中计算该项目编号的相应值。

主甘特图 - 形式

客户:

=index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0),3)

项目名称:
=index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0),4)

预定开始时间:

  • 规划:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1,7)
  • 设计:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8,7)
  • 数控:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4,7)
  • 工作坊:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4,7)
  • 安装阶段 1:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8,7)
  • 安装第 2 阶段:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8+1,7)
  • 补救措施:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8+1+1,7)
  • 完成:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8+1+1+1,7)

预定完成时间:

  • 规划:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1,8)
  • 设计:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8,8)
  • 数控:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4,8)
  • 工作坊:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4,8)
  • 安装阶段 1:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8,8)
  • 安装第 2 阶段:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8+1,8)
  • 补救措施:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8+1+1,8)
  • 完成:
    =index('FC: DATABASE'!$A$1:$J$1000,match(C11,'FC: DATABASE'!$B$1:$B$1029,0)+1+8+4+4+8+1+1+1,8)

剧本——需要考虑的问题:

  • 你想更新其他工作表当一个新项目被设置(添加)到数据库.

当创建新项目的过程完成时,如何定义EXACTLY?可以说是当用户在数据库|B 列中输入工作编号时。但是如果他们打错了字,或者从另一行复制/粘贴等等,该怎么办

获得更多控制权的另一种方法可能是插入一个复选框(比如在数据库|L 列中),当项目详细信息最终确定时,用户会选中该框。

onEdit()
脚本“监视”L 列,如果/当它找到新选中的框时,它会运行脚本的其余部分。


function onEdit(e) {

  // Logger.log(JSON.stringify(e)) DEBUG
  var sourceSheetName = "FC: DATABASE"

  // test for an edit in the database, in Column L and value = "TRUE"
  if(e.range.getSheet().getName() !== sourceSheetName || e.range.columnStart !== 12 || e.value !== "TRUE"){
    // doesn't meet criteria - do nothing
    // Logger.log("DEBUG: dont run the script")
    return
  }

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sourceSheet = ss.getSheetByName(sourceSheetName)

  var editedrow = e.range.rowStart
  var projectNumberRange = sourceSheet.getRange(editedrow,2)
  var projectNumber = projectNumberRange.getValue();
  // Logger.log("DEBUG: the project number range = "+projectNumberRange.getA1Notation()+", project number: "+projectNumber)

  // row increment between ranges on Master Gantt
  var rowDepth = 9
  var colStart = 1 //A
  var colWidth = 17 // Q
  var colPrjNum = 3 // Project Number = column 3 (C)

  var fcMGName = "FC:Master Gantt" 
  var fcMG = ss.getSheetByName(fcMGName)
  // get the last cell in Column C
  var fcMGLastCell = fcMG.getRange(fcMG.getLastRow(),colPrjNum)
  //Logger.log("DEBUG: Last Cell:"+fcMGLastCell.getA1Notation())
  // Up arrow to find the next cell with a value
  var fcMGLastProjectNbr = fcMGLastCell.getNextDataCell(SpreadsheetApp.Direction.UP);
  //Logger.log("DEBUG: :Last project cell: "+fcMGLastProjectNbr.getA1Notation()+", row = "+fcMGLastProjectNbr.getRow())
  var fcLastProject = fcMG.getRange(fcMGLastProjectNbr.getRow(),colStart,rowDepth,colWidth)
  // Logger.log("DEBUG: last project range: "+fcLastProject.getA1Notation())
 
  // adjust by 9 rows for the next blank project number
  var nextmsFGProject = fcMG.getRange(+fcMGLastProjectNbr.getRow()+rowDepth,colPrjNum)
  //Logger.log("DEBUG: Range for the next project number : "+nextmsFGProject.getA1Notation())

  // the formula to reference the Project Number on the Edited Row
  var formula = "='"+sourceSheetName+"'!"+projectNumberRange.getA1Notation()
  // Logger.log(formula) // DEBUG

  // set the formula to pick up the project number from the edited row in the database.
  nextmsFGProject.setFormula(formula);
  
}

© www.soinside.com 2019 - 2024. All rights reserved.