9

我已经对这个问题进行了大量搜索,我认为问题在于所有答案都导致了需要您创建库的解决方案。然后,我看到将该库添加到电子表格的唯一方法是为该电子表格创建一个新脚本并将其包含在内。

我想要的:一堆都包含一个主脚本的电子表格。每次更新脚本时,它们都会更新为使用最新的脚本。

我所拥有的:15 个电子表格,都有原始脚本的副本。原始脚本已更改,现在看来我必须编辑Copy of myScriptName每个复制的电子表格中存在的每个调用的脚本。

我做了什么:我创建了第一个电子表格,并从我在其脚本编辑器中创建的项目中编写了脚本。工作完美。然后,我为公司的每个部门制作了该电子表格的 14 个副本以供使用。

我如何才能共享脚本并在任何单独的电子表格本身之外对其进行管理?考虑到所有人都在寻找相同的答案,我必须在这里遗漏一些东西。我只是不明白使它成为一个库如何解决我的用例。

谢谢!

我看不出这有什么帮助,但根据评论的要求,这里是脚本:

function createRollupTable() {

  //Return if:
  //   There is only the account code parameters passed in with no quarterly info
  //   If the length of the account code parameters passed is empty
  if(arguments.length <= 1 || !arguments[0] || arguments[0].length <= 0) {
    return "";
  }

  var rollupTable = new Array();
  var fullListAccountCodes = arguments[0];

  //The first column of output is the full list of account codes for all the quarters
  rollupTable[0] = fullListAccountCodes;

  //Array to keep the YTD total for each account code
  var yearlyAccountCostOutput = new Array(fullListAccountCodes.length);

  //Iterate over all the quarters that were passed in
  for(var i=1;i<arguments.length;i++) {

    //This array should be set to the total length of the available account codes
    var quarterlyRollupCostOutput = new Array(fullListAccountCodes.length);
    var quarterlyBreakdown = arguments[i];
    var quarterIndexCounter = 0;
    var quarterTotalCost = 0;

    //Iterate over all the account codes
    for(var j=0;j<fullListAccountCodes.length && quarterIndexCounter<quarterlyBreakdown.length;j++) {

      //Find the one that matches the current account code for this quarter
      if(fullListAccountCodes[j] == quarterlyBreakdown[quarterIndexCounter][0]) {

        //Set the index of the output based on the full list so they align
        quarterlyRollupCostOutput[j] = quarterlyBreakdown[quarterIndexCounter][1];

        //Add this cost to the running total for the quarter
        quarterTotalCost += quarterlyBreakdown[quarterIndexCounter][1];

        //Add the total amount for the yearly rollup for that account code
        if(yearlyAccountCostOutput[j]) {
          yearlyAccountCostOutput[j] += quarterlyBreakdown[quarterIndexCounter][1];
        } else {
          yearlyAccountCostOutput[j] = quarterlyBreakdown[quarterIndexCounter][1];
        }

        //Increment the counter so we search for the next account code in the quarter
        quarterIndexCounter++;

      }
    }

    rollupTable[i] = quarterlyRollupCostOutput;

    //Add a blank row in the results for spacing
    rollupTable[i].push("");

    //Add the quarterly total cost
    rollupTable[i].push(quarterTotalCost);

  }

  //Add a blank row for spacing
  rollupTable[0].push("");

  //Google spreadsheet forces you to pad with non breaking spaces, no right align option available
  var spaces = "";
  var numSpaces = 66;
  for(var i=0;i<numSpaces;i++){spaces+=String.fromCharCode(160);};

  //Add a row for the Totals
  rollupTable[0].push(spaces + "Totals:");

  //Add the YTD column
  rollupTable.push(yearlyAccountCostOutput);

  return rollupTable;
}
4

1 回答 1

7

也许您所要求的只是一种将主脚本中的内容准确复制到电子表格副本中的所有脚本的方法,以便替换它们的代码并跳过引用库的需要,但是我'将提供我对库设置如何工作的印象......

我看到将该库添加到电子表格的唯一方法是为该电子表格创建一个新脚本

当您制作已包含库引用脚本的电子表格副本时,它将与新副本保持一致。因此,在创建了一个要复制的电子表格模板后,您不必创建任何新脚本。

该电子表格模板应具有对主脚本的库引用。主人不需要在工作表内,你不应该复制原始/主脚本。

因此,我们有:1 个主脚本1 个具有引用主脚本的脚本的电子表格模板,然后是您想要 的模板副本。

现在,当您设置库引用时,您可以选择在开发模式下将其连接到电子表格模板中。这将允许对主脚本中现有功能的任何更改立即影响模板副本(除非首先需要授权)。如果您采用这种方式,您可能需要先在主脚本的副本中测试您的更改。另一种选择是关闭开发模式,让模板副本的用户在每个脚本中手动更新他们的库版本(除非有一个我不知道的自动版本更新系统)。

这个设置仍然没有解决向主脚本添加一个全新的功能的问题,每个模板副本都需要引用。也许有人可以对此发表评论或提供单独的答案。

[更新:2015 年 3 月 15 日] 因此,将附加组件发布到 Chrome 网上应用店后,您可以安装一次附加组件并让它出现在您的所有表格/文档/表单中,我相信这是 OP 最初需要的. 推出新版本会更新所有使用它的 Google 文档。

https://developers.google.com/apps-script/add-ons/

于 2013-01-24T02:40:00.423 回答