7

私はセルに次の機能を持っています。他のセルから日付を読み取り、年齢を計算して「3 週間 5 日」の形式に変換します

=INT((TODAY()-D19)/7)&" weeks, "&(TODAY()-D19-(INT((TODAY()-D19)/7)*7))&" days"

できます。

ここで、この長い文字列を 1 つの単純な関数に置き換えたいと思います。

=AGEINWEEKS(D19)

どうやってやるの?

私はすでにスクリプトエディタでこのスクリプトを書き込もうとしました

function ageInWeeks(from_date) {
  return SpreadsheetApp.getActiveSheet().getRange("D16").setFormula('=ROUND((TODAY()-D16)/7)&" weeks, "&(TODAY()-D16-(ROUND((TODAY()-D16)/7)*7))&" days"');
}

しかし、それはエラーを返します

エラー: setFormula を呼び出す権限がありません (3 行目、ファイル「コード」)

前もって感謝します!

よろしく、トマズ

4

2 に答える 2

9

スプレッドシート関数と同じ結果を得るカスタム関数を作成しようとしている場合は、数式をスプレッドシートに設定するために使用するのではなく、計算を実行する方法で Google Apps Script を使用する必要があります ( Sergeが指摘したように、許可されていないため機能しません)。

(また、将来の読者に明確にするために、Google Apps Script とそのカスタム関数は、Google スプレッドシートの式を使用して計算を実行できません。それらは JavaScript 言語で計算を実行します。一方、setFormulas を介したスクリプトを使用して、スプレッドシートを作成できます。数式をセルに入力すると、スプレッドシートの数式が計算を実行します...ただし、スクリプトがカスタム関数として使用されている場合 (つまり、= 記号を使用してセル内で呼び出されている場合)、これを行うことはできません。スクリプトは、メニュー項目やトリガー (スプレッドシートの編集やタイマーに応答するトリガーなど) などの別の手段から呼び出されます)。

したがって、JavaScriptをカスタム関数に記述して、週、日を計算できます。そのようなスクリプトは次のようになります。

function ageInWeeks(date) {
var mil = new Date() - new Date(date).getTime()
var seconds = (mil / 1000) | 0;
mil -= seconds * 1000;

var minutes = (seconds / 60) | 0;
seconds -= minutes * 60;

var hours = (minutes / 60) | 0;
minutes -= hours * 60;

var days = (hours / 24) | 0;
hours -= days * 24;

var weeks = (days / 7) | 0;
days -= weeks * 7;
return weeks +' wks, ' + days + ' days'

}

これは、次のように D19 を参照する場合、D19 以外の任意のセルのスプレッドシートに入れることができます。

=ageInWeeks(D19)

セル D19 には過去の日付が含まれています。

(カスタム関数は、元のスプレッドシートの数式よりも遅くなる可能性があることに注意してください)

于 2013-07-13T19:42:09.600 に答える
2

ドキュメント から:カスタム関数は値を返しますが、セルの外部に値を設定することはできません。ほとんどの場合、セル A1 のカスタム関数はセル A5 を変更できません。

典型的なユースケースを説明すると、別のアプローチを提案できます。

于 2013-07-13T17:34:17.710 に答える