10

例如,我希望能够在 SharePoint 列表的计算列中使用今天的日期来确定任务是否过期。有一个有据可查的技巧,它涉及创建一个名为“Today”的虚拟列,在公式中使用它,然后将其删除,从而“欺骗”SharePoint 使用 Today 函数。

问题是这种方法不能可靠地工作——计算不是动态的;它仅在保存项目时生成,因此今天“列”有效地成为修改日期。(这可能是 SharePoint 不允许您直接使用 Today 功能的原因。)

有没有人找到有效的解决方案?我知道我可以使用 javascript 在客户端获取实际日期并显示颜色、标志等,但我正在寻找“服务器端”解决方案。


作为参考,Today 专栏的技巧及其问题在这两个帖子和相关评论中得到了很好的描述:http: //blogs.msdn.com/cjohnson/archive/2006/03/16/552314.aspxhttp:// pathtosharepoint.wordpress.com/2008/08/14/calculated-columns-the-useless-today-trick/

4

9 回答 9

4

根本没有办法解决这个问题。由于列表的值存储在数据库中并“按原样”返回给搜索爬虫等其他功能,因此无法创建动态字段。

可以创建一个自定义字段,在计算中使用今天的日期显示值。

于 2009-05-18T21:35:27.777 回答
4

除了 Christophe (PathToSharePoint) 的文章之外,本文还介绍了 Today 技巧以及为什么它不起作用

在计算列中使用 Today 的真相

有很多软糖,可能最好的是 Dessie 的控制台应用程序(MNM 上面提到过)

动态更新包含 Today 引用的 SharePoint 计算列

它很好但并不完美,例如您可能不得不担心不同的时区。

在走这条路之前,你应该问问自己,你是否真的、真的需要这样做。例如 :-

于 2009-06-25T12:28:13.687 回答
1

如果您创建 Today 列,则需要对其进行更新。您可以使用计时器作业或将 jquery 脚本放置在用户点击的页面上来做到这一点。该脚本可以调用 SPServices.SPUpdateMultipleListItems 来进行更新。传递一个 CAML 子句,以便您只更新需要更新 Today 值的列表项,例如每天一次。

于 2013-03-04T15:48:11.540 回答
0

我的建议是创建为您执行此计算的 on 字段,然后在您的 SharePoint 列表中引用它。这不是一个简单的实现,但它会起作用。

于 2009-05-18T20:16:54.737 回答
0

我也一直在寻找解决方案,但仍然没有运气.. Today 专栏技巧的局限性在于不是动态的。

不过,我确实有一个建议,我们为什么不创建一个计时器作业,该作业将在每天上午 12 点用当前日期更新某个特定列。我知道你们中的一些人可能会认为这有点过头了。只是我的建议:D!

于 2009-06-17T07:33:47.943 回答
0

我想出了一个非常粗略但有效的解决方案,无需进行任何编码。我将解释我是如何制作今天的专栏以及如何将其放入过期专栏的,因为该专栏也很难找到如何做。

首先,我做了一个名为“今天”的专栏(喘气!)。接下来,我创建了一个名为“Days Overdue”的专栏。然后我打开了共享点设计器并创建了一个新的工作流程。我将它设置为在每次编辑/更新项目时运行(请记住,我关闭了此列表的版本控制,否则我将不得不求助于编码以避免在我们的服务器上建立一堆无用的数据)。我将操作设置为简单地将修改后的日期存储在工作流变量中,然后将今天列的值更改为该变量。虽然修改后的列是日期/时间,而我今天的列只是一个日期,但它传输得很好。然后我将工作流程设置为暂停 2 小时。显然,您可以将其设置为您想要的任何时间,它只会更改您今天列更新的最新可能时间,即在我的情况下是凌晨 2 点。

到逾期天数列。这是那个人的代码-

=IF([Due Date]>Today,"None",IF([Date Closed]=0,Today-[Due Date],IF([Due Date]>[Date Closed],"None",IF(Today>=[Date Closed],[Date Closed]-[Due Date],IF([Due Date]<Today,Today-[Due Date])))))

这以天数的形式显示逾期天数,如果未逾期,则显示“无”。您可以使用数字格式或字符串格式,但不能使用日期格式。好吧,我希望这对遇到这个问题并且不想深入研究编码的人有所帮助。

编辑:我忘了说,在上面的逾期天数列的代码中,我输入如果今天已经过了关闭日期,使用关闭日期减去到期日而不是今天减去到期日,以确保计算关闭项目后不会继续发生。您可能会在代码中注意到这一点,但我觉得我应该指出它以防万一。

编辑 2:在我的计算列的第二次编辑之前,我在问题被标记为“已关闭”后没有正确计算逾期天数。我输入了更新的代码。代码的最后一部分没有意义,因为它与开头的逻辑相同,但它有效,所以我不想冒险!:)

和平。

于 2009-06-24T21:43:18.827 回答
0

我使用了以下,没有任何问题。

字段名称:过期

字段类型:计算

返回的数据类型:是/否

公式: =AND([Due Date]<NOW(),Status<>"Completed",[Due Date]<>"")

于 2013-10-30T17:13:54.310 回答
-1

这是一种解决方法:

创建一个名为 Today 的日期列。在计算公式中使用此列(忽略公式返回错误值的事实)。完成公式后,从列表中删除 Today 列。

出于某种原因,它以这种方式工作!现在 Sharepoint 将公式中的今天视为今天的日期。

注意:如果您决定要更改公式,则必须再次创建 Today 列。否则,它不会将 Today 识别为有效列。

于 2012-05-28T17:04:41.633 回答
-1

我尝试了@Farzad 的方法,它似乎运行良好。我想对经过的天数进行自定义计数,因此添加了一个计算列,以前我使用的是创建日期修改日期列之间的差异,只有在用户更新帖子时才会显示,这让我很沮丧。

我现在有一个公式,它可以按我的意愿工作并使用Today列,这里适用于任何想使用它的人。我还有一个 Status 列,在此基础上使用 On Hold 的基础,其余公式基于Today - Created的日期差异。

=IF(Status="On Hold","On Hold",IF(AND(Today=Created,(DATEDIF(Created,Today,"D")=0)),"New",IF(AND(Today<>Created,(DATEDIF(Created,Today,"D")=0)),"New (updated)",IF(DATEDIF(Created,Today,"d")>3,"Need Update Immediately",IF(DATEDIF(Created,Today,"d")=1,"One day old",IF(DATEDIF(Created,Today,"d")=2,"Two days old",""))))))

基本上它只是一堆嵌套的IF条件,它们为我提供标签,在此基础上,我可以在我的视图中添加一个组并在需要时过滤掉数据。希望这可以帮助任何寻找答案的人!

于 2012-12-14T07:33:18.610 回答