代码之家  ›  专栏  ›  技术社区  ›  Scott Marcus

如何在SharePoint Online中创建超过255个字符的动态超链接

  •  5
  • Scott Marcus  · 技术社区  · 6 年前

    我的设置:

    • SharePoint Online(Office 365的一部分)
    • 无法访问服务器编码的(.NET)解决方案
    • 使用文档集内容类型的文档库
    • 启用新体验UI

    使用案例:

    我要做的是在文档库中创建一个列,允许用户直接导航到工作流的启动表单,而不必右键单击项目,选择“高级”,然后选择“工作流”。

    指向工作流启动表单页面的链接(在手动导航到该页面时从浏览器的地址栏中取出)总体上如下所示(为便于阅读,添加了换行符):

    https://company.sharepoint.com/sites/ABC/wfsvc/e73969f753574a3bb30c8d3ce3ab9c56/WFInitForm.aspx
    
    ?List={f9b73015-1131-442d-95b8-9682149a27e6}
    
    &ID=5
    
    &ItemGuid={71AA92CE-2D37-4D43-B593-AB6004E9DCF0}
    
    &TemplateID={64193686-AB59-4D44-B0EB-FBD8E2CB7A1F}
    
    &WF4=1
    
    &Source=https%3A%2F%2Fcompany%2Esharepoint%2Ecom%2Fsites%2FABC%2FCourseDocuments%2FForms%2FCourseDocuments%2Easpx%3FRootFolder%3D%252Fsites%252FDCU%252FCourseDocuments%252FBasic%2520Stuff%26FolderCTID%3D0x0120D52000E334520C326BA440BF6F86F3CA80AE2800E3DBD1BD3A1EA348A9D944A931464C4D
    

    ID ItemGuid

    为了动态地为每个项目生成这个URL,我创建了第二个工作流,在添加库中的新项目时运行该工作流,并且可以手动运行(对于库中已经存在的项目),并且 该工作流确实正确地生成了每个项目所需的URL .

    此URL超过了“超链接或图片”列接受的255个字符,因此在尝试将此URL写入该列时,工作流会出错。

    我所做的:

    • 我尝试过通过使其相对(因此是完整的)来缩短URL Picture”字段,但这导致工作流错误“Invalid URL” 即使当复制并粘贴到 地址栏。
    • Bitly 这一次,工作流完成并编写了一个可点击的 当它们与其他部分连接时,最终的URL将引导 在Bitly站点出现404错误。
    • 我做了一个“计算”列,设置为“日期/时间”结果 使计算是将部分URL连接到 HTML超链接语法(即。 ="<a href='"&[column1]&[column2]&[column3]&"'>Click</a>" 成功地把整件东西制作出来,并把它放进 库中,如果所有动态部分都正确,则不会渲染场 可点击的链接。(下面的图片显示了一个相对的URL,但是通过这种方法,我使用了一个绝对URL。图片仅显示正在生成的标记的结果,而不是解析的结果。)

      enter image description here

    • 我尝试添加“完整的HTML内容 将“字段发布到我的库”的约束条件(使用SharePoint 服务器发布基础结构站点功能已启用)并获得 与计算列显示的HTML标记相同 上面的尝试。
    • 我尝试过使用“多行”文本字段并得到相同的标记 同样显示。
    • 根据 this article 带有“无效URL”消息。

    因此,底线是,我可以创建所需的URL,但无法找到一种方法将其放置到每个项目的字段中,从而使其可以作为实际的超链接单击。


    针对下面的@Luk Nepor建议,我已经尝试了不同的方法,但是按照您的指示又尝试了一次。我没有在列表中设置列格式的选项,但是在列表设置中配置列时,我确实得到了这个选项,所以我在这里输入了JSON。

    enter image description here enter image description here

    但是,当我尝试时,JSON格式不起作用。

    enter image description here

    3 回复  |  直到 6 年前
        1
  •  3
  •   Lukas Nespor    6 年前

    新用户体验(一般)

    column formatting . 如何在字段中显示(更改)列表。一个可能的用途是呈现带有当前项属性的链接。几乎所有字段都可以引用,包括 ID 但不幸的是,不是GUID。

    为了解决GUID字段(没有代码)的问题,可以在列表中创建文本列并调用它。 Log Change Request . 然后创建简单工作流并将这个新创建的列设置为当前项的GUID。不要忘记将工作流设置为在创建新项目时运行。

    enter image description here

    enter image description here

    右边的窗格将打开。将下面的JSON粘贴到字段并保存更改。

    {
      "$schema": "https://developer.microsoft.com/json-schemas/sp/column-formatting.schema.json",
      "elmType": "a",
      "txtContent": "Link",
      "attributes": {
        "href": {
          "operator": "+",
          "operands": [
            "https://company.sharepoint.com/sites/ABC/wfsvc/e73969f753574a3bb30c8d3ce3ab9c56/WFInitForm.aspx",
            "?List={f9b73015-1131-442d-95b8-9682149a27e6}",
            "&ID=",
            "[$ID]",
            "&ItemGuid=",
            "@currentField",
            "&TemplateID={64193686-AB59-4D44-B0EB-FBD8E2CB7A1F}",
            "&WF4=1",
            "&Source=https%3A%2F%2Fcompany%2Esharepoint%2Ecom%2Fsites%2FABC%2FCourseDocuments%2FForms%2FCourseDocuments%2Easpx%3FRootFolder%3D%252Fsites%252FDCU%252FCourseDocuments%252FBasic%2520Stuff%26FolderCTID%3D0x0120D52000E334520C326BA440BF6F86F3CA80AE2800E3DBD1BD3A1EA348A9D944A931464C4D"
          ]
        }
      }
    }
    

    创建项,当工作流完成时,该列应包含所需的链接。


    Client Side Rendering . 它与新体验中的列格式相同。

    日志更改请求

    1) 创建Javascript文件并调用它,例如log change-请求.js

    // CSR-override for MDS enabled site
    RegisterModuleInit("~site/SiteAssets/log-change-request.js", RegisterLink);
    
    // CSR-override for MDS disabled site
    RegisterLink(); 
    
    function RegisterLink() {
      var field = {};
      field.Templates = {};
      field.Templates.Fields = {
        "LogChangeRequest": {
          "View": fieldTemplate
        }
      };
    
      SPClientTemplates.TemplateManager.RegisterTemplateOverrides(field);
    }
    
    function fieldTemplate(context) {
      var item = context.CurrentItem;
      return "<a href='"
        + "https://company.sharepoint.com/sites/ABC/wfsvc/e73969f753574a3bb30c8d3ce3ab9c56/WFInitForm.aspx"
        + "?List={f9b73015-1131-442d-95b8-9682149a27e6}"
        + "&ID=" + item.ID
        + "&ItemGuid=" + item.UniqueId
        + "&TemplateID={64193686-AB59-4D44-B0EB-FBD8E2CB7A1F}"
        + "&WF4=1"
        + "&Source=https%3A%2F%2Fcompany%2Esharepoint%2Ecom%2Fsites%2FABC%2FCourseDocuments%2FForms%2FCourseDocuments%2Easpx%3FRootFolder%3D%252Fsites%252FDCU%252FCourseDocuments%252FBasic%2520Stuff%26FolderCTID%3D0x0120D52000E334520C326BA440BF6F86F3CA80AE2800E3DBD1BD3A1EA348A9D944A931464C4D"
        + "'>"
        + "Link"
        + "</a>";
    }
    

    日志更改请求 .
    3) 下载安装 SharePoint Online Client Components SDK . 它将复制一些使用PowerShell连接到SharePoint所需的dll。
    JSLink 属性设置为Javascript文件的路径。

    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
    
    function Set-JSLink() {
      Param(
        [string]$SiteUrl,
        [string]$ListTitle,
        [string]$ColumnTitle,
        [string]$JSLinkUrl
      )
    
      $creds = Get-Credential
    
      $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl)
      $ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($creds.UserName, $creds.Password)
    
      $list = $ctx.Web.Lists.GetByTitle($ListTitle)
      $ctx.Load($list)
      $ctx.ExecuteQuery()
    
      $column = $list.Fields.GetByTitle($ColumnTitle)
      $column.JSLink = $JSLinkUrl
      # Make it read only so it is not visible in new or edit form
      $column.ReadOnlyField = $true
      $column.Update()
    
      $ctx.ExecuteQuery()
      $ctx.Dispose()
    }
    
    # Example:
    Set-JSLink -SiteUrl "https://tenant.sharepoint.com/sites/ABC" -ListTitle "Document Sets" -ColumnTitle "Log Change Request" -JSLinkUrl "~site/SiteAssets/log-change-request.js"
    

    JSOM解决方案如何设置列
    使用此方法不需要安装任何SDK。只要把这个HTML代码放到脚本编辑器。

    <form>
      <input type="text" id="listTitle" placeholder="List title" /><br />
      <input type="text" id="columnTitle" placeholder="Column title" /><br />
      <input type="text" id="jsLink" placeholder="JSLink Url" /><br />
      <button onclick="setColumn(); return false;">Configure column</button>
    </form>
    
    <script type="text/javascript">
      'use strict';
      SP.SOD.executeFunc("sp.js")
    
      function setColumn() {
        var listTitle = document.getElementById("listTitle").value;
        var columnTitle = document.getElementById("columnTitle").value;
        var jsLink = document.getElementById("jsLink").value;
    
        var cc = new SP.ClientContext()
        var list = cc.get_web().get_lists().getByTitle(listTitle);
        cc.load(list);
        cc.executeQueryAsync(
          function () {
            var column = list.get_fields().getByTitle(columnTitle);
            column.set_jsLink(jsLink);
            column.set_readOnlyField(true);
            column.update();
    
            cc.executeQueryAsync(
              function () {
                alert("Column sucessfuly configured");
              },
              function (sender, args) {
                console.error(args.get_message());
              }
            );
          },
          function (sender, args) {
            console.error(args.get_message());
          }
        );
    
        cc.dispose();
      }
    
    </script>
    

    5) 打开一些文档集,添加文档,列中应该包含您需要的链接。

    注:

    不管设置中设置了什么(新的或经典的体验)。

        2
  •  0
  •   Szab    6 年前

    1. 来源 查询字符串参数占用了URL的大约一半。如果您不关心返回的URL,那么整个部分很可能会被安全地删除,这将导致您的字符串在标准URL字段的255个字符限制内。
    2. 创建一个启用了HTML支持的注释字段(从UI创建它时,必须选择 增强的富格文本(包含图片、表格和超链接的富文本) 选项),然后使用此字段存储标记( <a href="...">...</a>

    此外,由于链接可以显示在许多地方(例如列表视图、列表视图Web部件、列表项表单),因此请避免使用相对URL—而 ../wfsvc/[wf_id]/... URL在列表视图上下文中可能是正确的,在列表项表单上下文中则不正确。使用绝对URL或web服务器相对URL(例如 /sites/yoursite/wfsvc/[wf_id]/...

        3
  •  0
  •   Craig.Feied    6 年前

    多行文本字段旨在作为“长URL”需求的解决方案。

    处理富文本,而不是默认的多行文本。更改此设置(如果对您可用)将使您的超链接呈现为超链接,并且您将不受适用于超链接列的255个字符限制。

    对于Sharepoint Online,您可以在“列表设置”或“库设置”中选择列,然后为“格式文本”或“增强的格式文本”设置单选按钮。

    对于“新体验”,不可能将文本格式化为 Rich Text . 您仍然可以将文本格式化为 Enhanced Rich Text 富格文本 .

    MSFT有一个backlog项来添加对NE的多行富文本支持,但在我任职MSFT期间,我从未遇到过这种令人讨厌的小差距的合理优先级划分,所以没有人说何时可以修复它。

    enter image description here