9

私はこの問題を大量に検索しましたが、問題はすべての答えがライブラリの作成を必要とする解決策になることだと思います。次に、そのライブラリをスプレッドシートに追加する唯一の方法は、そのスプレッドシート用の新しいスクリプトを作成して含めることです。

私が欲しいもの: 1 つのマスター スクリプトをすべて含むスプレッドシートの束。スクリプトが更新されるたびに、それらはすべて最新のスクリプトを使用するように更新されます。

私が持っているもの: 元のスクリプトのコピーがすべて含まれている 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 つのスプレッドシート テンプレートには、マスター スクリプトへのライブラリ参照が必要です。マスターはシート内にある必要はなく、元の/マスター スクリプトをコピーするべきではありません。

つまり、1 つのマスター スクリプト、マスターを参照するスクリプトを含む1 つのスプレッドシート テンプレート、そして必要な数のテンプレートのコピーがあります。

ライブラリ参照をセットアップするときに、開発モードでスプレッドシート テンプレートに接続するオプションがあります。これにより、マスター スクリプト内の既存の関数に対する変更がテンプレートのコピーに即座に反映されます (最初に認証が必要でない限り)。このようになっている場合は、最初にマスター スクリプトのコピーで変更をテストすることをお勧めします。もう 1 つのオプションは、開発モードをオフのままにし、テンプレート コピーのユーザーに各スクリプト内のライブラリ バージョンを手動で更新させることです (私が知らない自動バージョン更新システムがない限り)。

ただし、このセットアップでは、各テンプレート コピーを参照する必要があるマスター スクリプトに完全に新しい関数を追加するという問題はまだ解決されていません。誰かがコメントしたり、別の答えを提供したりできるかもしれません。

[更新: 2015 年 3 月 15 日] アドオンを Chrome Web ストアに公開すると、アドオンを一度インストールするだけで、すべてのスプレッドシート / ドキュメント / フォームに表示されるようになります。 . 新しいバージョンをプッシュすると、それを使用するすべての Google ドキュメントが更新されます。

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

于 2013-01-24T02:40:00.423 に答える