私は仕事が取るだろうと思い、開始日と時間数に基づいて、タスクの終了日を提供するために、Googleシートでカスタム関数を作成していため、カスタム関数の最大スタックの深さを超えています。は、Googleシート
つまり終了日=開始日+時間。
機能は、(私はランチタイムを除く土日祝日を指定するまで作業していて、良い時間内のすべてのよ)週末をスキップして、9と17時間の稼働日を考慮することを目指しています。
機能は、約5活動のため正常に動作しますが、その後のエラーは、「最大スタックの深さを超過します」。ここで私が言及しているもののスクリーンショットです。
そして、ここではAppScript/JavaScriptのです。
//var startdate = new Date(2016, 04, 16, 9, 0, 0);
//var addhours = 3;
Date.prototype.addHours = function(h) {
this.setHours(this.getHours() + h);
return this;
}
Date.prototype.addDays = function(days) {
var dat = new Date(this.valueOf());
dat.setDate(dat.getDate() + days);
return dat;
}
/**
* Adds hours to a date excludes weekends
*
* @param {number} startdate The date to add the hours to
* @param {number} addHours The hours to add
* @return The new date
* @customfunction
*/
function MYWORKDAY(startdate, addhours) {
var endDate = new Date();
var endTime = new Date(startdate).setHours(17, 0, 0);
var remainingEffortHrs = new Date();
var availableTimeHrs = endTime - startdate;
availableTimeHrs = (availableTimeHrs/1000)/60/60;
if (startdate.map) { // Test whether input is an array.
return startdate.map(MYWORKDAY); // Recurse over array if so.
} else {
// Add the hours to the start date
//endDate = new Date(startdate).addHours(addhours);
endDate = new Date(startdate).addHours(addhours);
// Calculate remaining effort - if the task ends after 5pm
if (endDate > endTime) {
remainingEffortHrs = ((Math.abs(endDate - endTime))/1000)/60/60;
} else {
remainingEffortHrs = 0;
}
if (remainingEffortHrs > 0) {
startdate = new Date(startdate).addDays(1);
startdate = MYWORKDAY(startdate, remainingEffortHrs);
} else {
// Remaining effort is 0
startdate = endDate;
}
return GetNextWorking(startdate);
}
}
function GetNextWorking(endDate) {
// Get the next working day
if (endDate.getDay() != 0 && endDate.getDay() != 6) {
return endDate;
} else {
adjustedEndDate = new Date(endDate.setDate(endDate.getDate() + 1));
adjustedEndDate = new Date(adjustedEndDate);
// Recursively call the this function until the returned
// date is a working day
return adjustedEndDate = GetNextWorking(adjustedEndDate);
}
}
これは意味があると思います。これはこの段階に入るのにしばらく時間がかかり、性能やリファクタリングを改善する方法についての提案は非常に高く評価されます。
ループを使用して再帰を避けることを検討しましたか? スタックの深さを増やすことは可能ですが(これは実現可能だと思いますが)、どのように制限を決定しますか?再帰は線形タスクにはあまり適していません(少なくともテール再帰のサポートを保証していない言語では) –
こんにちはステファン、あなたの返事に感謝します。私はこれをより効率的にするアイデアには開放されています。そのため、再帰的な要素を取り除くことが必要です。私は「尾部再帰」が何であるかはわかりませんが、私が調べることができるものです。スタック深度は、私がこれを書いているGoogle Sheetsアプリケーションによって設定されていると思います。 – mulkraj
こんにちはStefan、私は再帰の代わりにループを使用するようにコードを修正しました。私は今、Googleスプレッドシートに日付を追加する機能を持っています。復帰日です。ご助力ありがとうございます。 – mulkraj