<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Srinivas Varukala's Bits &amp; Bytes</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/svarukala/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/svarukala/feed.xml</link>
    <description>Office 365, SharePoint, Azure, Dev et al.</description>
    <lastBuildDate>Fri, 26 Jan 2018 19:35:44 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>PowerShell to list all Azure AD Apps with expiration dates</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/powershell-to-list-all-azure-ad-apps-with-expiration-dates</link>
      <pubDate>Fri, 26 Jan 2018 18:33:14 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=1335</guid>
      <description><![CDATA[This article is about how to get all Azure AD Applications using PowerShell. Especially the focus is...]]></description>
      <content:encoded><![CDATA[This article is about h<span style="color: #000000;font-family: Calibri">ow to get all Azure AD Applications using PowerShell. Especially the focus is on identifying the Azure AD Apps that are expiring. </span>

To begin with, <span style="color: #000000;font-family: Calibri">Azure AD Apps keys are of two types:</span>
<ol type="1" start="1">
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span>Passwords </span>
<ol type="a" start="1">
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span>These are auto-generated on demand. While doing this we can select either 1 year or 2 years or Never expires (as shown in screenshot below). </span></li>
</ol>
</li>
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span>Public Keys </span>
<ol type="a" start="1">
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span>These are the manual keys created using certificates. The screenshot shows the thumbprints for the certificate that was used as a key.</span></li>
</ol>
</li>
</ol>
<a href="https://msdnshared.blob.core.windows.net/media/2018/01/neverexpires.jpg"><img width="300" height="131" class="alignnone size-medium wp-image-1355" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/01/neverexpires-300x131.jpg" /></a>

B<span style="color: #000000;font-family: Calibri">elow is PS script that can be used to list out all the Azure AD apps along with the Keys (both types) and the expiry dates.</span>
<script src="https://gist.github.com/svarukala/64ade1ca6f73a9d18236582e8770d1d4.js"></script>

<span style="color: #24292e;font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size: 14px;font-style: normal;font-weight: 400;letter-spacing: normal;text-align: start;text-indent: 0px;background-color: #ffffff;float: none">This is the sample output from this script. Note that some of the apps can have multiple entries or zero entries as an app can have multiple keys or no keys at all.</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/01/appslist.jpg"><img width="300" height="26" class="alignnone size-medium wp-image-1345" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/01/appslist-300x26.jpg" /></a>]]></content:encoded>
    </item>
    <item>
      <title>Update all items in a large list/library using Microsoft Flow (no-code solution)</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/update-all-items-in-a-large-listlibrary-using-microsoft-flow-no-code-solution</link>
      <pubDate>Thu, 17 Aug 2017 21:49:27 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=1256</guid>
      <description><![CDATA[This is the part 3 of the 3 part series related to handling large lists with Microsoft Flow – a...]]></description>
      <content:encoded><![CDATA[<p>This is the part 3 of the <a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/04/using-microsoft-flow-with-large-lists-3-part-series/">3 part series</a> related to handling large lists with Microsoft Flow – a no-code solution. 
</p><p>This post will demonstrate how you can iterate through a large list (or library) circumventing the list view threshold restrictions and update the items. 
</p><p><strong>Solution is simple</strong>: Get list items in chunks (of say 512 items) and iterate over each item and call into a child Flow (nested flow concept, remember?). This child flow will take care of updating the list item. The Flow that we will create will introduce you to following concepts:
</p><ol><li>Nested flows
</li><li>Using Microsoft Cognitive API – Language detection
</li><li>Parsing JSON
</li><li>Data operations/manipulations
</li></ol><p><strong>Which column are we going to update?
</strong></p><p>If you remember from my blog post part 1, we created a large list from tweets from Twitter. I have screenshot below, you can see that there is a column called <strong>LangDetected</strong> which is empty. We are going to pass the Tweet text (Title column) to a Cognitive API to detect the language and then update this column with the detected language.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit1.png" alt="" />
	</p><p><strong>Detailed Steps:
</strong></p><ol><li><div>We will begin with the child flow that we created (steps 7.1 to 7.4) in <a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/08/iterate-and-get-all-items-from-a-sharepoint-large-list-or-library-using-microsoft-flow-no-code-solution/">Part 2</a> of this <a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/04/using-microsoft-flow-with-large-lists-3-part-series/">blog series</a>. For your reference here is the screenshot of this child flow in its current state:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit2.png" alt="" />
			</p></li><li>Add Apply to each step next and pass the output from Get items step to it as input.
</li><li><div>Action: Search for Detect Language, Select 'Text Analytics – Detect Language'.  I configured the Cognitive API Text Analytics already in Part 1. Configure it by selecting the Title column as its input.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit3.png" alt="" />
			</p></li><li><div>Action: Search for "Parse JSON", Select Data operation – Parse JSON. Pass the output from Detect Language step to this step. In the schema, past the following:
</div><p><span style="font-size:8pt"><strong><em>{
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>  "type": "array",
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>  "items": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    "type": "object",
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    "properties": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "name": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>        "type": "string"
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      },
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "iso6391Name": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>        "type": "string"
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      },
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "score": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>        "type": "number"
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      }
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    },
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    "required": [
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "name",
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "iso6391Name",
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "score"
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    ]
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>  }
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>}
</em></strong></span></p><p>Tip: To create schema, you can pick sample output from DetectLanguage step and use it in jsonschema.net website to generate the schema.
</p></li><li><div>Action: Search for Compose &gt; Select Data Operations – Compose. We will use expression first(body('Parse_JSON'))?['name'] to get the first language detected from the Parse JSON step.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit4.png" alt="" />
			</p></li><li>We will create a separate flow that will be called within this flow. This separate flow will take the language detected and item index as input parameters and update the corresponding list item.
</li><li><div>Create a Child Flow by starting from blank Flow template.
</div><ol><li><div>Trigger: Search for Request, Select 'Request/Response – Request' trigger. This will create a URL for this flow that we can call into from the parent flow. This is similar to HTTP Triggered Functions in Azure. We want to send the item index and language detected to this flow as JSON data. Configure this trigger to accept ID (item id) and Lang (Detected language) using below JSON schema.
</div><p><span style="font-size:8pt"><strong><em>{
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>  "type": "object",
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>  "properties": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    "ID": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "type": "integer"
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    },
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    "Lang": {
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>      "type": "string"
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>    }
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>  }
</em></strong></span></p><p><span style="font-size:8pt"><strong><em>}
</em></strong></span></p></li></ol><p><span style="font-size:8pt"><strong><em>    <img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit5.png" alt="" />
						</em></strong></span></p><ol><li><div>Action: Search for Update Item &gt; Select SharePoint - Update item action. Configure it by passing the ID and Lang as follows:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit6.png" alt="" />
					</p></li><li><div>Here is the full screenshot of this child flow
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit7.png" alt="" />
					</p></li></ol><p>    
</p><ol><li><div>Expand the trigget 'Request' action and copy the  HTTP POST URL
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit8.png" alt="" />
					</p></li></ol><p>
 </p></li><li><div>Continuing editing parent flow from step 6. We got the Language detected in step 6. We need to now call the child flow and pass the item index and language detected as JSON parameter. 
</div><ol><li><div>Action: Search for HTTP, Select HTTP – HTTP action. Configure as follows
</div><ol><li>Method: POST
</li><li>Uri: Paste the URL copied from stpe 7.d
</li><li>Body: as shown in this image<strong><em>
								</em></strong></li></ol><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit9.png" alt="" />
					</p></li></ol></li><li><div>That completes the parent flow. Here is the full screenshot of this flow. 
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit10.png" alt="" />
			</p></li><li><div>After running these flows (from part 2 and 3) I was able to update the Language column for every tweet for all the 5500+ items. Here is the screenshot of the large list. Notice the LangDetected column (last column)
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081717_2152_Updateallit11.png" alt="" /></p></li></ol>]]></content:encoded>
    </item>
    <item>
      <title>How to download or view SharePoint Online Search Crawl Logs using Security &amp; Compliance Center</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/how-to-download-or-view-sharepoint-online-search-crawl-logs-using-security-compliance-center</link>
      <pubDate>Wed, 09 Aug 2017 21:00:37 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=985</guid>
      <description><![CDATA[About 2 years back I wrote this article on 'How to View SharePoint Online Crawl Logs in Office 365'....]]></description>
      <content:encoded><![CDATA[About 2 years back I wrote this article on '<a href="https://blogs.technet.microsoft.com/mspfe/2015/11/17/how-to-view-sharepoint-online-crawl-logs-in-office-365/">How to View SharePoint Online Crawl Logs in Office 365</a>'. Things change quickly in Office 365 for good reasons. If you don't know it already, you will no longer be able to create new eDiscovery cases in SharePoint Online which essentially makes my article obsolete.

Regarding the deprecation of eDiscovery center cases, if you visit this site: <a href="https://support.office.com/en-us/article/Set-up-an-eDiscovery-Center-in-SharePoint-Online-A18F8975-AA7F-43B4-A7D6-001D14744D8E">Set up an eDiscovery Center in SharePoint Online</a>, you will be greeted with this message in the top of the page:

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo1.png" />

In this post, I will explain two ways to download the crawl logs in SharePoint Online:
<ol>
 	<li>Using the Content Search in Security &amp; Compliance center</li>
 	<li>Using the eDiscovery feature again in Security &amp; Compliance center</li>
</ol>
<strong>Using Content Search
</strong>
<ol>
 	<li>If you want to use Global Admin account or Security &amp; Compliance admin account then you can start with step 3. If you want to assign someone permissions to allow them to run this then follow step 2.</li>
 	<li>
<div>Office 365 Global Admin must create or assign the right permissions for a user to be able to export crawl logs.</div>
<ol>
 	<li>
<div>The minimal permissions I could figure out after playing with permissions is as follows:</div>
<ol>
 	<li>Export</li>
 	<li>Preview</li>
 	<li>Compliance Search</li>
</ol>
</li>
 	<li>Logged in as Global admin or Security &amp; Compliance center admin, Navigate to Security &amp; Compliance center &gt; Permissions page.</li>
 	<li>Click the <span style="font-size: 14pt"><strong>+</strong></span> button. In the pop up window, give it an appropriate name (I named mine as 'ContentSearchUser').</li>
 	<li>Within the popup window, click the <span style="font-size: 14pt"><strong>+ </strong></span>button under Roles. This opens another popup window.</li>
 	<li>
<div>In this window, select the 3 roles: Export, Preview and Compliance Search. Click the '<strong>Add</strong>' button and then the '<strong>Save</strong>' button.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo2.png" /></li>
 	<li>
<div>Click the <span style="font-size: 14pt"><strong>+ </strong></span>button under Members. Search for the user(s) or security group, select it, click <strong>Add</strong> button, then <strong>Save</strong> button.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo3.png" /></li>
 	<li>These members added in above step can access the Security &amp; Compliance center by navigating to this URL: <a href="https://protection.office.com">https://protection.office.com</a> and follow from step 3 onwards.</li>
</ol>
</li>
 	<li>Navigate to <strong>Security &amp; Compliance center</strong> &gt; <strong>Search &amp; Investigation</strong> &gt; <strong>Content Search</strong> page</li>
 	<li>
<div>Click the <span style="font-size: 14pt"><strong>+</strong></span> button to create a new Content Search request.</div>
<ol>
 	<li>
<div>Give it an appropriate name and add the SharePoint Online Site URL using the <span style="font-size: 14pt"><strong>+</strong></span> button in the bottom section. In my case I added one SP site URL. You can add one or more.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo4.png" /></li>
 	<li>
<div>Click Next button to see next screen.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo5.png" /></li>
 	<li>Click '<strong>Search</strong>' button.</li>
</ol>
</li>
 	<li>
<div>After some wait you will see the options to <strong>Preview search results</strong>, <strong>Update search results</strong> and '<strong>Start export'</strong> link. Click that link.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo6.png" /></li>
 	<li>
<div>Start export link opens a pop window. Select 2<sup>nd</sup> or 3<sup>rd</sup> radio button and click '<strong>Start Export'</strong> button.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo7.png" /></li>
 	<li>
<div>Once export is finished, you will see the '<strong>Download exported results'</strong> link activated.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo8.png" /></li>
 	<li>
<div>Click '<strong>Download exported results'</strong> link.</div>
<ol>
 	<li>If this is the first time this functionality being used on your computer, you will see prompt like the one below to download '<strong>Microsoft Office 365 eDiscovery Export Tool'</strong>.</li>
</ol>
<p style="margin-left: 18pt"><img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo9.png" /></p>

<ol>
 	<li>One this is installed, if it doesn't prompt you automatically, click the download result link again. The prompt will let you download results and copy an export key. Shown below.</li>
</ol>
</li>
</ol>
<p style="margin-left: 54pt"><img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo10.png" /></p>

<ol style="margin-left: 72pt">
 	<li>
<div>When you click on the '<strong>Download results'</strong> link, you will see another prompt to enter the Export key and a folder on your PC to save the files:</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2017/08/080917_2100_Howtodownlo11.png" /></li>
 	<li>In the downloaded results, you will see a bunch of files. Look for this file: Unindexed Items.csv. This file contains the list of items that failed to index.</li>
 	<li>Below is sample data that I identified in my test site:</li>
</ol>
<div>
<table style="border-collapse: collapse" border="0"><colgroup> <col style="width: 251px" /> <col style="width: 330px" /> <col style="width: 81px" /> <col style="width: 73px" /> <col style="width: 109px" /> <col style="width: 83px" /> <col style="width: 319px" /></colgroup>
<tbody valign="top">
<tr style="height: 38px">
<td style="padding-left: 14px;padding-right: 14px;border: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Item Identity</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Original Path</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Type</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Size (KB)</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Error Code</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Error Type or Addtional Error Info</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>Error Message</strong></span></td>
</tr>
<tr style="height: 76px;background: #f2f2f2">
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>SharePoint\Unindexed Items\Developer Site\Dev\Shared Documents\OWA\RetailPortal.docx</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><a href="https://mod362200.sharepoint.com/sites/Dev/Shared"><span style="font-size: 5pt">https://mod362200.sharepoint.com/sites/Dev/Shared</span></a><span style="font-size: 5pt"> Documents/OWA/RetailPortal.docx</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Unknown</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">116.082</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">1</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Warning</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">This item was partially parsed. ( Document was partially processed. The parser was not able to parse the entire document.; ; SearchID = 67E4FC59-5BDC-4993-B798-EBAA52D9EC52 )</span></td>
</tr>
<tr style="height: 76px">
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>SharePoint\Unindexed Items\Developer Site\Dev\Shared Documents\OWA\hjh\RetailPortal.docx</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><a href="https://mod362200.sharepoint.com/sites/Dev/Shared"><span style="font-size: 5pt">https://mod362200.sharepoint.com/sites/Dev/Shared</span></a><span style="font-size: 5pt"> Documents/OWA/hjh/RetailPortal.docx</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Unknown</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">116.081</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">1</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Warning</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">This item was partially parsed. ( Document was partially processed. The parser was not able to parse the entire document.; ; SearchID = 0FF5DC80-00B1-4726-A0EB-C6745634A479 )</span></td>
</tr>
<tr style="height: 76px;background: #f2f2f2">
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>SharePoint\Unindexed Items\Developer Site\Dev\Shared Documents\Test9-8\RetailPortal.docx</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><a href="https://mod362200.sharepoint.com/sites/Dev/Shared"><span style="font-size: 5pt">https://mod362200.sharepoint.com/sites/Dev/Shared</span></a><span style="font-size: 5pt"> Documents/Test9-8/RetailPortal.docx</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Unknown</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">116.083</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">1</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Warning</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">This item was partially parsed. ( Document was partially processed. The parser was not able to parse the entire document.; ; SearchID = 5AC2D0C7-063F-4035-AC90-ADEC2A8BC3F9 )</span></td>
</tr>
<tr style="height: 76px">
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt"><strong>SharePoint\Unindexed Items\Dev1\Dev1\Shared Documents\Kerberos Troubleshooting Guide.docx</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><a href="https://mod362200.sharepoint.com/sites/Dev1/Shared"><span style="font-size: 5pt">https://mod362200.sharepoint.com/sites/Dev1/Shared</span></a><span style="font-size: 5pt"> Documents/Kerberos Troubleshooting Guide.docx</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Unknown</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">814.877</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt">
<p style="text-align: right"><span style="font-size: 5pt">1</span></p>
</td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">Warning</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-size: 5pt">This item was partially parsed. ( Document was partially processed. The parser was not able to parse the entire document.; ; SearchID = 4CB4AC77-5D94-40EE-8E8F-A7C5D0438E48 )</span></td>
</tr>
</tbody>
</table>
</div>
<span style="font-family: Times New Roman;font-size: 12pt">Below are the columns that you must look into within the CSV file:
</span>
<ul>
 	<li><span style="font-family: Times New Roman;font-size: 12pt">Error Code
</span></li>
 	<li><span style="font-family: Times New Roman;font-size: 12pt">Error Type
</span></li>
 	<li><span style="font-family: Times New Roman;font-size: 12pt">Error Message
</span></li>
 	<li><span style="font-family: Times New Roman;font-size: 12pt">Last Crawl Attempt (Date)
</span></li>
 	<li><span style="font-family: Times New Roman;font-size: 12pt">Source (URL)
</span></li>
 	<li><span style="font-family: Times New Roman;font-size: 12pt">Source Name
</span></li>
</ul>
<span style="font-family: Times New Roman;font-size: 12pt">Sample data for the Error Code, Error Type and Error Message:
</span>
<div>
<table style="border-collapse: collapse" border="0"><colgroup> <col style="width: 171px" /> <col style="width: 225px" /> <col style="width: 851px" /></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 14px;padding-right: 14px;border: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>Error Code</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>Error Type</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: solid #bfbfbf 0.5pt;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>Error Message</strong></span></td>
</tr>
<tr style="background: #f2f2f2">
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>17</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">Warning</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">The object was deleted.</span></td>
</tr>
<tr>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>15</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">Container Error</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">This item and all items under it will not be crawled because the owner has set the
</span>

<span style="font-family: Times New Roman;font-size: 9pt">NoCrawl flag to prevent it from being searchable (SearchID = GUID VALUE)</span></td>
</tr>
<tr style="background: #f2f2f2">
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>497</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">Container Error</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">An unrecognized HTTP response was received when attempting to crawl this item.
</span>

<span style="font-family: Times New Roman;font-size: 9pt">Verify whether the item can be accessed using your browser. ( SearchID = GUID VALUE)</span></td>
</tr>
<tr>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: solid #bfbfbf 0.5pt;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt"><strong>21</strong></span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">Warning</span></td>
<td style="padding-left: 14px;padding-right: 14px;border-top: none;border-left: none;border-bottom: solid #bfbfbf 0.5pt;border-right: solid #bfbfbf 0.5pt"><span style="font-family: Times New Roman;font-size: 9pt">This item was truncated because the parsed output was greater than the maximum number of allowed characters. (Max output size of 2000000 has been reached while parsing!; ; -1 (0): Parsing error parsing invalid JSON input stream.
; SearchID = GUID VALUE)</span></td>
</tr>
</tbody>
</table>
</div>
<span style="font-family: Times New Roman;font-size: 12pt"><strong>Using eDiscovery Center
</strong></span>

<span style="font-family: Times New Roman;font-size: 12pt">Alternative method to download crawl logs in SharePoint Online is using the eDiscovery capabilities.
</span>

<span style="font-family: Times New Roman;font-size: 12pt">As an eDiscovery Manager or Administrator (which is one of the higher roles that can be assigned within the Permissions page in Security &amp; Compliance center), one can create eDiscovery cases, configure it to search select SPO sites and download the results. The user experience is very similar to using 'Content Search'. I am not detailing the steps here for now. If there is enough interest, I will update this article with detailed steps late on.
</span>]]></content:encoded>
    </item>
    <item>
      <title>Iterate and get all items from a SharePoint Large List or Library using Microsoft Flow (no-code solution)</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/iterate-and-get-all-items-from-a-sharepoint-large-list-or-library-using-microsoft-flow-no-code-solution</link>
      <pubDate>Tue, 08 Aug 2017 03:33:09 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=896</guid>
      <description><![CDATA[Update (8/15/17): Added more content at the end of this article, related to using the out of the box...]]></description>
      <content:encoded><![CDATA[<p><strong>Update (8/15/17):</strong> Added more content at the end of this article, related to using the out of the box pagination feature avoiding a lot of steps needed as long as it's less than 5000 items.
</p><p>This is the part 2 of the <a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/04/using-microsoft-flow-with-large-lists-3-part-series/">3 part series</a> related to handling large lists with Microsoft Flow – a no-code solution. 
</p><p>This post will demonstrate how you can iterate through a large list (or library) circumventing the list view threshold restrictions.
</p><p>Once you have the list iterator in Flow, you can use and reuse for man use cases, such as updating a List column data for all the items or copying list items to a different list or identifying items based on a certain criterion, so on so forth.
</p><p><strong>Solution is moderately complex</strong>: Get list items in chunks (of say 512 items) and iterate over each item to read the items. The Flow that we will create will introduce you to following concepts:
</p><ul><li>Using Variables
</li><li>Using Workflow definition language (WDL)
</li><li>Using Nested Flows 
</li><li>Using Arrays
</li><li>Using Data Operations (like Compose)
</li></ul><p><strong>What's the need for this post?</strong> The main reason I even thought about blogging this was because the 'SharePoint – Get Items' action used to support only 512 items i.e. it could fetch only 512 items at a time. But things have changed since then, it now supports large items (&gt;1000) too. I tested with a large list to fetch 5000+ items and sure enough it failed with below error:
</p><p>{ "status": 502, "message": "<span style="background-color:yellow">The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator</span>.\r\nclientRequestId: bac7333a-f73b-4338-a431-ca88c70fd8a0", "source": "https://mytenant.sharepoint.com/teams/corpcomm//_api/SP.APIHubConnector.GetListItems(listName='c23b10c5-c190-45f2-bc9b-aabe72f87d08',queryOptions=@q)?@q='%2524top%3d5100'", "errors": [ "-2147024860", "Microsoft.SharePoint.SPQueryThrottledException" ] }
</p><p>This means, this blog post is still relevant, because the only way to get around this is to get the large list items in smaller chunks.
</p><p><strong>Detailed Implementation Steps:
</strong></p><ol><li>Trigger: We can either use a Schedule or a HTTP trigger as the first step. I chose Schedule and configured it to once per day.
</li><li><div>Action: Search for 'Variable' &gt; select 'Variable – Initialize Variable' step. Configure it as follows. This variable will be used to identify how many times we need to iterate to get all the list items in chunks of say 512 items.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg1.png" alt="" />
			</p></li><li><div>Action: 'SharePoint – Get Items'. Get the total item count using the ID desc , top count 1 settings.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg2.png" alt="" />
			</p></li><li><div>Add 'Apply for each' and pass output from step 3 as input.
</div><ol><li>Action: Within Apply for each &gt; Search for 'Compose' &gt; Select 'Data Operations – Compose'. Compose is a powerful action; it can be used to evaluate <a href="https://flow.microsoft.com/en-us/blog/use-expressions-in-actions/">expressions</a> (Excel type formulas from <a href="https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-workflow-definition-language">Workflow Definition language</a>), create variables etc. We will use compose to calculate the number of times we require to iterate in chunks of say 512 items to process all the items. We simply divide (using Div() expression) the total item count by 512. By default, the Div() expression always returns the floor value for the result. For example, Div(925, 512) will give you 1 (floor value), not 2 (ceiling value). This is important to note and has a downside that's fixed in step 4.c. Here is the expression that you need put in the compose: "@div(item()?['ID'],512)" if you are going to type it.  Flow designer now supports Expression in the pop up shown in the below image.
</li></ol><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg3.png" alt="" />
			</p><ol><li>Add a Condition after 'Compose' action. The condition checks if the output from step 5 is greater than 1. 
</li><li><div>IF YES, 
</div><ol><li>Add another 'Compose' action with this formula: add(outputs('Compose'),1). This basically increments the value that we got in step 4.a by one. This ensures that we cover a scenario where there is are residual items that's not covered by the iterations because step 4.a gives floor value but not ceiling value. E.g lets say total items count = 925. Step 4.a gives results as 1. But if we iterate just once, we get back the first 512 items only. To get around this we iterate one more time to get the residual items.
</li><li>Add action &gt; search for variable &gt; select Set Variable action. Set the IterationCount variable to the output from the above step.
</li></ol></li><li>IF NO, do nothing
</li></ol><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg4.png" alt="" />
			</p></li><li><div>Action: Add 'Data Operations – Compose'. We use the expression range() to create an array. The expression to be used is: "@range(1,variables('IterationCount'))". We will use this array as input to a for-each loop and iterate that many times. The array is like this: (1,2,3,4,5) if iterationcount = 5.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg5.png" alt="" />
			</p></li><li><div>Add Apply to each step (for-each loop). Pass the output (array) from step 5 as its input. This will loop n times where n is the iteration count that we calculated already.
</div><ol><li>Action: Add 'Data Operations – Compose'. This will apply an expression to identify the starting index (ID) of the items to fetch the next 512 items. So, for 1st iteration this value should begin with 0, 2<sup>nd</sup> iteration it should be 512, 3<sup>rd</sup> iteration should be 1024 so on. I used the expression: "@mul(sub(item(),1),512)". This uses subtract and multiply functions. Here item() signifies the current loop index (from the array) that we supplied as input to the for-each step. For 1<sup>st</sup> iteration, mul(sub(1,1), 512) returns 0.
</li></ol><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg6.png" alt="" />
			</p><ol><li><div>Now introducing the concept of <a href="https://flow.microsoft.com/en-us/blog/build-nested-flows/">Nested Flows</a>. We will create a separate flow that will be called within this flow. This separate flow will take the item index as parameter and fetch the next 512 items starting from that index. This is very similar to writing code, that has methods/functions/subroutines. This child flow will be a method that parent flow will call into. Now let's create the child flow.
</div><p>
 </p></li></ol></li><li><div>Create Child Flow by starting from blank Flow template. 
</div><ol><li><div>Trigger: Search for Request, Select 'Request/Response – Request' trigger. This will create a URL for this flow that we can call into from the parent flow. This is similar to HTTP Triggered Functions in Azure. We want to send the item index to this flow as JSON data. I added the JSON schema for an ItemIndex variable of type integer. See below:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg7.png" alt="" />
					</p><p><strong><em>{
</em></strong></p><p><strong><em>  "type": "object",
</em></strong></p><p><strong><em>  "properties": {
</em></strong></p><p><strong><em>    "ItemIndex": {
</em></strong></p><p><strong><em>      "type": "integer"
</em></strong></p><p><strong><em>    }
</em></strong></p><p><strong><em>  }
</em></strong></p><p><strong><em>}
</em></strong></p></li><li><div>Action: Add SharePoint – Get Items action. Now configure to fetch the next 512 items starting with the index number that's passed as a JSON parameter to this flow. As shown below, we use the Filter Query to filter by ID greater than or equal to ItemIndex.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg8.png" alt="" />
					</p></li><li><div>Here is the full screenshot of this flow:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg9.png" alt="" />
					</p></li><li><div>Expand the 'Request' action and copy the  HTTP POST URL
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg10.png" alt="" />
					</p></li></ol></li><li><div>Continuing editing parent flow from step 6. We got the itemindex figured out in step 6. We need to now call the child flow and pass the itemindex as JSON parameter. 
</div><ol><li><div>Action: Search for HTTP, Select HTTP – HTTP action. Configure as follows
</div><ol><li>Method: POST
</li><li>Uri: Paste the URL copied from stpe 7.d
</li><li><div>Body: 
</div><p><strong><em>{
</em></strong></p><p><strong><em>  "ItemIndex": "@{outputs('Compose_3')}"
</em></strong></p><p><strong><em>}
</em></strong></p></li></ol><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg11.png" alt="" />
					</p></li><li>The for-each loop created in Step 6, will not call the child flow n number of times, where n is the iterationcount that we calculated.
</li><li><div>That's the end of the parent flow. Here is the full screenshot with minimized actions/steps
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg12.png" alt="" />
					</p></li></ol></li></ol><p>In Part 3, I will show you how to update the list items from within the child flow, creating grandchild flow and also show you how to use Cognitive API to detect tweet text language. 
</p><p>
 </p><p>UPDATE (8/15/17)
</p><p>Just a week before I published this article there was an <a href="https://flow.microsoft.com/en-us/blog/four-connector-action-settings/">announcement</a> that allows "pagination" using the Flow actions like SharePoint – Get Items. Essentially that solves the problem that I went through documenting in this article. I set out to test this new feature and created a Flow to get more than 5000 items from my list using pagination. I found some limitations which makes this blog post still a valid one. Yay! More details below.
</p><ol><li>Started from a blank flow. Added Schedule as my trigger. Configured it to run once per day. This doesn't matter. This the quickest way to create a flow with least amount of work/settings.
</li><li><div>Action: Added SharePoint – Get Items. Provided my SPO site url, large list and set Top Count to 10. See screen below.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg13.png" alt="" />
			</p></li><li><div>Now, click on the ellipses i.e the three dots (…) in the top right corner for the Get items action and select settings.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg14.png" alt="" />
			</p></li><li><div>In the screen opened you will see a way to turn on pagination and set max items to fetch.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg15.png" alt="" />
			</p></li><li>I turned on the Pagination, set the Limit to 50. So, the Get Items action will fetch 10 items (since we set Top count to 10) each up to 50. Essentially it iterated 5 times getting 10 items each.
</li><li>I ran the flow and voila within a few seconds, it's done and it got back 50 items as expected.
</li><li><div>Now, I changed the max Limit from 50 to 5100, to test the limits. Also, changed the top count to 1000, so that it paginates 5 times fetching 1000 items each. Saved/updated the flow. That's when I got this error message in the top:
</div><p><em><span style="font-size:8pt">The pagination policy of workflow run action 'Get_items' of type 'ApiConnection' at line '1' and column '751' is not valid. The value specified for property 'minimumItemsCount' exceeds the maximum allowed. Actual: '5100'. Maximum: '5000'.</span>
				</em></p><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/081517_1923_Iterateandg16.png" alt="" />
			</p></li><li>That's it, it still has the 5000 items limit. Pagination is a great feature, but we still have to go through a manual steps using flow to iterate more than 5000 items as shown in this blog post.
</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Using Microsoft Flow with Large Lists (3 part series)</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/using-microsoft-flow-with-large-lists-3-part-series</link>
      <pubDate>Fri, 04 Aug 2017 05:21:29 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=226</guid>
      <description><![CDATA[Microsoft Flow and Large Lists - Part 1

Create Large Lists/Libraries using Microsoft Flow...]]></description>
      <content:encoded><![CDATA[Microsoft Flow and Large Lists - Part 1

<a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/04/create-large-lists-using-microsoft-flow-no-code-solution/">Create Large Lists/Libraries using Microsoft Flow (no-code solution)</a>

Microsoft Flow and Large Lists - Part 2

<a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/08/iterate-and-get-all-items-from-a-sharepoint-large-list-or-library-using-microsoft-flow-no-code-solution/">Iterate and get all items from a Large List/Library using Microsoft Flow (no-code solution)</a>

Microsoft Flow and Large Lists - Part 3

<a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/17/update-all-items-in-a-large-listlibrary-using-microsoft-flow-no-code-solution/">Update all items in a large list/library using Microsoft Flow (no-code solution)</a>

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Create SharePoint Large Lists using Microsoft Flow (no-code solution)</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/create-large-lists-using-microsoft-flow-no-code-solution</link>
      <pubDate>Fri, 04 Aug 2017 05:19:57 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=345</guid>
      <description><![CDATA[This is the part 1 of the 3 part series related to handling large lists with Microsoft Flow – a...]]></description>
      <content:encoded><![CDATA[<p>This is the part 1 of the <a href="https://blogs.msdn.microsoft.com/svarukala/2017/08/04/using-microsoft-flow-with-large-lists-3-part-series/">3 part series</a> related to handling large lists with Microsoft Flow – a no-code solution. 
</p><p>This post will demonstrate how you can create large lists with test data. 
</p><p>There could be many reasons to create a large list. In my case, I had to demonstrate how PowerApps can deal with large lists and I needed a large list (with &gt;5000 items). I could create a Microsoft Flow to do exactly that. Now my Flow can be saved as a template and reused by others too. This makes Flow even more powerful.
</p><p><strong>Solution is very simple</strong>: Monitor twitter feed and get the tweet data into a SharePoint List. 
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare1.png" alt="" />
	</p><p>I added something extra to the mix. I also used Microsoft Cognitive API (specifically <a href="https://azure.microsoft.com/en-us/services/cognitive-services/text-analytics/">Text Analytics API</a>) to detect the sentiment (positive or negative tweet) of the twitter feed and extract some good metadata out of it which will be saved into List columns.
</p><p>I also added the logic to insert items only if the total items count is &lt; 5500 items. This effectively stops populating the list forever. This will save your Flow execution cycles and also your Azure spend on the Text analytics api. 
</p><p>Below are screens of the list after populating it with &gt;5000 items.
</p><p>Screen 1:
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare2.png" alt="" />
	</p><p>Screen 2:
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare3.png" alt="" />
	</p><p>Screen 1: Shows the items sort ascending on the ID column.
</p><p>Screen 2: Shows the items sort descending on the ID Column. You can see that my list has &gt;5000 items.
</p><p>
 </p><p>Detailed Steps:
</p><ol><li><div>Create the SharePoint list (I named it MyCorp Tweets). Add columns:
</div><ol><li>TwitterHandle (Text)
</li><li>RetweetCount (Number)
</li><li>FollowersCount (Number)
</li><li>SentimentScore (Number, two decimal with %)
</li><li>LangDetected (Text)
</li></ol></li><li><div>Begin by selecting the Tigger "when a new tweet is posted". You could start from existing template or from blank.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare4.png" alt="" />
			</p></li><li><div>I configure it to search for certain keywords that's popular: SharePoint OR Azure
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare5.png" alt="" />
			</p></li><li><div>Add an action as the next step and select SharePoint – Get Items and configure it to retrieve only a single item with the max ID. I used Order By and Top count parameter to achieve this.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare6.png" alt="" />
			</p></li><li>Next Add an Apply to Each action. Pass the output from the SharePoint – Get items to this step as input. 
</li><li><div>Now Add a Condition action. The condition checks if the ID (gotten from SharePoint – Get items) is &lt;= 5500. Below screen shows it in action:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare7.png" alt="" />
			</p></li><li><div>Let's shift gears and go to Azure Portal to create Cognitive Services – Text Analytics Service. In Azure Portal, clicke +New button, search for "Cognitive Services". Select it and click Create button.  Fill up the details as follows to create a new Text Analytics service.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare8.png" alt="" />
			</p></li><li><div>Once the Text Analytics service is created, select it and then select 'Keys' that is under the "Resource Management" within the settings blade. Copy one of the keys to clipboard.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare9.png" alt="" />
			</p></li><li><div>Now, lets get back to Flow designer. If the above condition (step 7) is satisfied (i.e IF YES branch), lets pass the tweet text to the Text Analytics – Detect Sentiment action. To do this, add an action in the IF YES branch and search for "Text Analtyics". Select Text Analytics – Detect Sentiment. Give it a unique connection name and paste the key into the Account key text field.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare10.png" alt="" />
			</p></li><li><div>Next, configure it by passing the Tweet text as its input.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare11.png" alt="" />
			</p></li><li><div>Now add new action SharePoint – Create Item.  Configure it as follows:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare12.png" alt="" />
			</p></li><li>Note that I am using the 'Score' value which is the output from the Text Analytics – Detect Sentiment step. 
</li><li><div>Overall, your flow should look something like below.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2017/08/080417_1919_CreateShare13.png" alt="" />
			</p></li><li>I have not added any action to the 'IF NO' branch for the IF condition. I will leave that as an exercise for you. You can add an Email action to alert you that the list has enough items.
</li></ol><p><span style="font-family:Times New Roman;font-size:12pt">In the Part 2 of this series I will show you how to Iterate and get all items from a Large List/Library using Microsoft Flow (no-code solution). When I worked on this demo, Flow could get a max 512 items only. So the solution to iterate a large list is quite interesting. 
</span></p><p>  </p>]]></content:encoded>
    </item>
    <item>
      <title>Office 365 CDN - Preview vs General Availability</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/office-365-cdn-preview-vs-general-availability</link>
      <pubDate>Wed, 24 May 2017 16:06:00 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=206</guid>
      <description><![CDATA[Office 365 CDN which provides a way to configure a SharePoint Document Library as a CDN is now...]]></description>
      <content:encoded><![CDATA[Office 365 CDN which provides a way to configure a SharePoint Document Library as a CDN is now Generally Available.

The preview was released few months back and if customers already using it while in Preview must know that the PowerShell commands and the way this works has changed a lot in General Availability. With GA, we now have a public CDN and a private CDN. Note that Private CDN is in Preview.

The main point to note is that the CDN URL generator /_vti_bin/publiccdn.ashx is not working anymore. This essentially means do not use it, update your URLs with the GA api.

Preview vs General Availability
<table border="1">
<tbody>
<tr>
<td width="162"></td>
<td width="613">
<h3>Preview</h3>
</td>
<td width="656">
<h3>General Availability</h3>
</td>
</tr>
<tr>
<td width="162">Link</td>
<td width="613">https://dev.office.com/blogs/office-365-public-cdn-developer-preview-release</td>
<td width="656">https://dev.office.com/blogs/general-availability-of-office-365-cdn</td>
</tr>
<tr>
<td width="162">Enable CDN (Tenant level setting)</td>
<td width="613">Set-SPOTenant -PublicCdnEnabled $true

&nbsp;</td>
<td width="656">#<strong>NOTE</strong>: Public CDN is GA. Private CDN is in preview.

Set-SPOTenantCdnEnabled -CdnType Public   #-NoDefaultOrigins

Set-SPOTenantCdnEnabled -CdnType Private #-NoDefaultOrigins

#Alternatively enable both using below cmdlet

#Set-SPOTenantCdnEnabled -CdnType Both</td>
</tr>
<tr>
<td width="162">Verify CDN Enabled</td>
<td width="613">Get-SPOTenant | FL *cdn*

&nbsp;</td>
<td width="656">Get-SPOTenantCdnEnabled -CdnType Public

Get-SPOTenantCdnEnabled -CdnType Private</td>
</tr>
<tr>
<td width="162">Get CDN Policies</td>
<td width="613">Get-SPOTenant | Select PublicCdnAllowedFileTypes

&nbsp;</td>
<td width="656">Get-SPOTenantCdnPolicies -CdnType Private

Get-SPOTenantCdnPolicies -CdnType Public</td>
</tr>
<tr>
<td width="162">Set CDN Policy</td>
<td width="613">Set-SPOTenant -PublicCdnAllowedFileTypes "CSS,EOT,GIF,ICO,JPEG,JPG,JS,MAP,PNG,TXT"

&nbsp;</td>
<td width="656">Set-SPOTenantCdnPolicy -PolicyType {IncludeFileExtensions | ExcludeRestrictedSiteClassifications | ExcludeIfNoScriptDisabled}

-PolicyValue &lt;string&gt; -CdnType

{Public | Private}</td>
</tr>
<tr>
<td width="162">New CDN Origin</td>
<td width="613">New-SPOPublicCdnOrigin -Url "https://contoso.sharepoint.com/siteassets/folder1"

&nbsp;</td>
<td width="656">Add-SPOTenantCdnOrigin -CdnType Public -OriginUrl sites/dev/cdnlib

Add-SPOTenantCdnOrigin -CdnType Private -OriginUrl sites/pub/cdnlib

Add-SPOTenantCdnOrigin -CdnType Public -OriginUrl */imageassets

Add-SPOTenantCdnOrigin -CdnType Public -OriginUrl */photos</td>
</tr>
<tr>
<td width="162">Get CDN Origins</td>
<td width="613">Get-SPOPublicCdnOrigins

&nbsp;</td>
<td width="656">Get-SPOTenantCdnOrigins -CdnType Public

Get-SPOTenantCdnOrigins -CdnType Private</td>
</tr>
<tr>
<td width="162">Remove CDN Origins</td>
<td width="613">Remove-SPOPublicCdnOrigin -Identity 193700617159…

&nbsp;</td>
<td width="656">Remove-SPOTenantCdnOrigin -CdnType Public -OriginUrl sites/dev/cdnlib

Remove-SPOTenantCdnOrigin -CdnType Private -OriginUrl sites/pub/cdnlib</td>
</tr>
<tr>
<td width="162">CDN Url Structure</td>
<td width="613">https://publiccdn.sharepointonline.com/&lt;tenant host name&gt;/&lt;ID of the public CDN origin&gt;/&lt;sub-path under the origin&gt;

&nbsp;

E.g: <em>https://publiccdn.sharepointonline.com/</em>

<em>contoso.sharepoint.com</em>

<em>/159..e352d/jigsaw.jpg </em>

&nbsp;</td>
<td width="656">https://publiccdn.sharepointonline.com/&lt;tenant host name&gt;/sites/site/library

E.g:<em>https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/photos/jigsaw.jpg </em>

<em>“https://privatecdn.sharepointonline.com/contoso.sharepoint.com/sites/pub/CDNLib/3.png?_eat_=1495567990_1130bbbb93becf13dd9ec288398ef3f53a8dd131d7f1116f9d3f0b89a5277b45</em>

<em>&amp;_oat_=1495567990_de85e8d775578ba993690038577140247188eb5a69c7855ffffb89d5f8525519”</em>

&nbsp;</td>
</tr>
<tr>
<td width="162">Generate CDN Url</td>
<td width="613">https://contoso.sharepoint.com/_vti_bin/publiccdn.ashx/

url?itemurl=https://contoso.sharepoint.com/

sites/Dev/SiteAssets/Photos/jigsaw.jpg

NOTE: This CDN Url generator is not working anymore since the GA. I am assuming this is to discourage using the Preview api. I will update this as I learn more about it.

See Vesa's note <a href="https://techcommunity.microsoft.com/t5/SharePoint-Developer/Office-365-CDN-Not-working-File-not-found/td-p/54769">here</a>.</td>
<td width="656">https://contoso.sharepoint.com/_vti_bin/publiccdn.ashx/url?itemurl=https:// contoso.sharepoint.com/sites/Dev/SiteAssets/Photos/jigsaw.jpg

&nbsp;</td>
</tr>
<tr>
<td width="162">CDN URL Validation in Fiddler</td>
<td width="1269" colspan="2">Add header “Referer: https://contoso.sharepoint.com” to the GET request</td>
</tr>
<tr>
<td width="162">Auto-Rewrite of URls</td>
<td width="613">Not Applicable</td>
<td width="656">Only in GA</td>
</tr>
</tbody>
</table>
<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Connect-SPOService</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><a href="https://contoso-admin.sharepoint.com/"><span style="color: #0563c1">https://contoso-admin.sharepoint.com</span></a></span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span></span>

<span style="color: darkgreen;font-family: 'Lucida Console';font-size: 9pt">###GENERAL AVAILABILITY API######</span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenantCdnEnabled</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenantCdnEnabled</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Private</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Set-SPOTenantCdnEnabled</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span><span style="color: #000000">  </span><span>#-NoDefaultOrigins </span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Set-SPOTenantCdnEnabled</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Private</span><span style="color: #000000"> </span><span>#-NoDefaultOrigins</span></span>

<span style="color: darkgreen;font-family: 'Lucida Console';font-size: 9pt">#Set-SPOTenantCdnEnabled -CdnType Both </span>

&nbsp;

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenantCdnPolicies</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenantCdnPolicies</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Private</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Set-SPOTenantCdnPolicy</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-PolicyType</span><span style="color: #000000"> {</span><span>IncludeFileExtensions</span><span style="color: #000000"> </span><span>|</span><span style="color: #000000"> </span><span>ExcludeRestrictedSiteClassifications</span><span style="color: #000000"> </span><span>|</span><span style="color: #000000"> </span><span>ExcludeIfNoScriptDisabled</span><span style="color: #000000">} </span><span>-PolicyValue</span><span style="color: #000000"> </span><span>&lt;</span><span>string&gt;</span><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span></span>

<span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000">    {</span><span>Public</span><span style="color: #000000"> </span><span>|</span><span style="color: #000000"> </span><span>Private</span><span style="color: #000000">}</span></span>

<span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Add-SPOTenantCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span><span style="color: #000000"> </span><span>-OriginUrl</span><span style="color: #000000"> </span><span>sites/dev/cdnrepo</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Add-SPOTenantCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Private</span><span style="color: #000000"> </span><span>-OriginUrl</span><span style="color: #000000"> </span><span>sites/pub/cdnlib</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Add-SPOTenantCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span><span style="color: #000000"> </span><span>-OriginUrl</span><span style="color: #000000"> </span><span>*/imageassets</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Add-SPOTenantCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span><span style="color: #000000"> </span><span>-OriginUrl</span><span style="color: #000000"> </span><span>*/photos</span></span>

<span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenantCdnOrigins</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenantCdnOrigins</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Private</span></span>

<span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Remove-SPOTenantCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Public</span><span style="color: #000000"> </span><span>-OriginUrl</span><span style="color: #000000"> </span><span>sites/dev/cdnlib</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Remove-SPOTenantCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Private</span><span style="color: #000000"> </span><span>-OriginUrl</span><span style="color: #000000"> </span><span>sites/pub/cdnlib</span></span>

<span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span></span><span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Set-SPOTenantCdnEnabled</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-CdnType</span><span style="color: #000000"> </span><span>Both</span><span style="color: #000000"> </span><span>-Enable</span><span style="color: #000000"> </span><span>$false</span></span>

<span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span></span><span style="color: darkgreen;font-family: 'Lucida Console';font-size: 9pt">#GA SAMPLES</span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">URL FORMAT: <a href="https://publiccdn.sharepointonline.com/%3ctenant"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/&lt;tenant</span></a></span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>host</span><span style="color: #000000"> </span><span>name&gt;/sites/site/library</span><span style="color: #000000"> </span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/cdnlib/3.png"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/cdnlib/3.png</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/cdnlib/SharePointCapabilities.jpg"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/cdnlib/SharePointCapabilities.jpg</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/ImageAssets/ProdMgmt.png"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev/ImageAssets/ProdMgmt.png</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev1/photos/jigsaw.jpg"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/dev1/photos/jigsaw.jpg</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://privatecdn.sharepointonline.com/contoso.sharepoint.com/sites/pub/CDNLib/3.png?_eat_=1495567990_1130bbbb93becf13dd9ec288398ef3f53a8dd131d7f1116f9d3f0b89a5277b45&amp;_oat_=1495567990_de85e8d775578ba993690038577140247188eb5a69c7855ffffb89d5f8525519"><span style="color: #0563c1">https://privatecdn.sharepointonline.com/contoso.sharepoint.com/sites/pub/CDNLib/3.png?_eat_=1495567990_1130bbbb93becf13dd9ec288398ef3f53a8dd131d7f1116f9d3f0b89a5277b45&amp;_oat_=1495567990_de85e8d775578ba993690038577140247188eb5a69c7855ffffb89d5f8525519</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://contoso.sharepoint.com/sites/pub/CDNLib/3.png"><span style="color: #0563c1">https://contoso.sharepoint.com/sites/pub/CDNLib/3.png</span></a></span>

<span style="color: darkgreen;font-family: 'Lucida Console';font-size: 9pt">###PREVIEW API########</span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenant</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>|</span><span style="color: #000000"> </span><span>FL</span><span style="color: #000000"> </span><span>*cdn*</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Set-SPOTenant</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-PublicCdnEnabled</span><span style="color: #000000"> </span><span>$true</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOTenant</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>|</span><span style="color: #000000"> </span><span>Select</span><span style="color: #000000"> </span><span>PublicCdnAllowedFileTypes</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Set-SPOTenant</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-PublicCdnAllowedFileTypes</span><span style="color: #000000"> </span><span>"CSS,EOT,GIF,ICO,JPEG,JPG,JS,MAP,PNG,SVG,TTF,WOFF,TXT"</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">New-SPOPublicCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-Url</span><span style="color: #000000"> </span><span>"<a href="https://contoso.sharepoint.com/siteassets/folder1"><span style="color: #0563c1">https://contoso.sharepoint.com/siteassets/folder1</span></a>"</span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Get-SPOPublicCdnOrigins</span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">Remove-SPOPublicCdnOrigin</span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>-Identity</span><span style="color: #000000"> </span><span>1937006161eeae8fe7159…</span></span>

<span style="color: darkgreen;font-family: 'Lucida Console';font-size: 9pt">#PREVIEW SAMPLES</span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt">URL FORMAT: <a href="https://publiccdn.sharepointonline.com/%3ctenant"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/&lt;tenant</span></a></span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: #000000"> </span><span>host</span><span style="color: #000000"> </span><span>name&gt;/&lt;ID</span><span style="color: #000000"> </span><span>of</span><span style="color: #000000"> </span><span>the</span><span style="color: #000000"> </span><span>public</span><span style="color: #000000"> </span><span>CDN</span><span style="color: #000000"> </span><span>origin&gt;/&lt;sub-path</span><span style="color: #000000"> </span><span>under</span><span style="color: #000000"> </span><span>the</span><span style="color: #000000"> </span><span>origin&gt;</span><span style="color: #000000"> </span></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://publiccdn.sharepointonline.com/contoso.sharepoint.com/159000625d30dd0f368ee9b30b58438a863871fc93f2d0256cb1169ad6cee080807e352d/jigsaw.jpg"><span style="color: #0563c1">https://publiccdn.sharepointonline.com/contoso.sharepoint.com/159000625d30dd0f368ee9b30b58438a863871fc93f2d0256cb1169ad6cee080807e352d/jigsaw.jpg</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://contoso.sharepoint.com/sites/Dev/SiteAssets/adal-lib/jigsaw.jpg"><span style="color: #0563c1">https://contoso.sharepoint.com/sites/Dev/SiteAssets/adal-lib/jigsaw.jpg</span></a></span>

<span style="color: blue;font-family: 'Lucida Console';font-size: 9pt"><a href="https://contoso.sharepoint.com/_vti_bin/publiccdn.ashx/url?itemurl=https://contoso.sharepoint.com/sites/Dev/SiteAssets/adal-lib/jigsaw.jpg"><span style="color: #0563c1">https://contoso.sharepoint.com/_vti_bin/publiccdn.ashx/url?itemurl=https://contoso.sharepoint.com/sites/Dev/SiteAssets/adal-lib/jigsaw.jpg</span></a> </span>
<h2>How does image renditions work in combination with the Office 365 CDN:</h2>
SharePoint Online and 2013/2016, it supports image renditions. Image renditions are configured using the Site Settings &gt; Look &amp; Feel &gt; Image Renditions page. Example entry:

RenditionID: 8, Width: 200, Height: 400

Image renditions are used by appending the renditionid to the image url.

For example: https://contoso.sharepoint.com/sites/pub/cdnlib/jigsaw.png?RenditionID=8

This same approach is not supported with the images in a CDN enabled library. That means if you append RenditionID to CDN url (example: https://publiccdn.sharepointonline.com/mod362200.sharepoint.com/sites/pub/photos/jigsaw.jpg?RenditionID=8), its not honored.

Image Renditions for CDN images can be achieved much more easily by just appending the width and height to the CDN Url. Example: https://publiccdn.sharepointonline.com/contoso.sharepoint.com/sites/pub/photos/jigsaw.jpg?height=100&amp;width=100&amp;cropMode=fit
<ul>
 	<li>Image rendition support for images from the CDN can be enabled with height and width query parameters in the URL
<ul>
 	<li>Note. both height and width parameters are required for the renditions to work</li>
 	<li>You can also control the cropMode for the images with cropMode query parameter with following options: fit, fill, top and bottom (fit is default value).</li>
</ul>
</li>
 	<li>You can use renditions with query parameters for the image URL</li>
</ul>
&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: Best practices for uploading more than 5000 items to a library/list (aka large lists)</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/sharepoint-best-practices-for-uploading-more-than-5000-items-to-a-librarylist-aka-large-lists</link>
      <pubDate>Sun, 07 May 2017 00:33:01 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=195</guid>
      <description><![CDATA[Requirement: Store thousands of documents in SharePoint Online (or on-premises) document library...]]></description>
      <content:encoded><![CDATA[<strong>Requirement</strong>: Store thousands of documents in SharePoint Online (or on-premises) document library without facing any threshold (5000 item limit) issues.

This post is assuming that you either have a bulk of documents to be uploaded along with the metadata (in a CSV file) or expect the library to grow in thousands. So prepare for that.

To being with, you can store up to 30,000,000 documents (as of May 6th, 2017) in a document library by nesting folders (use flat view to get around folders navigation issue – see step 6), or using multiple views with proper filtering on metadata columns. As per <a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Furldefense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttps-3A__na01.safelinks.protection.outlook.com_-3Furl-3Dhttps-253A-252F-252Furldefense.proofpoint.com-252Fv2-252Furl-253Fu-253Dhttps-2D3A-5F-5Ftechnet.microsoft.com-5Fen-2D2Dus-5Flibrary-5Fcc262787-2D28v-2D3Doffice.16-2D29.aspx-2526d-253DDwMFAg-2526c-253D-5FhRq4mqlUmqpqlyQ5hkoDXIVh6I6pxfkkNxQuL0p-2DZ0-2526r-253DfR3NG3FQThxTt7kSxn0Cbyc0K4D6v2RSlg4-5FV6UBIR4-2526m-253Dl1IXVzkbKFKElRIbvHESALtIOsX8di9AL0OjDKSdoeQ-2526s-253DqFl61cd8-2Dho3xnGOfrNHQrIiXaWhDq1jh7Q1FVUg-5FiQ-2526e-253D-26data-3D02-257C01-257Csvarukal-2540microsoft.com-257C05a7207d972e45f810f408d48d2938d0-257C72f988bf86f141af91ab2d7cd011db47-257C1-257C0-257C636288655581230026-26sdata-3DhWE8iNZ5zRX2qi1DdWL8tjNP0JFEn0Hekbo6Him8um8-253D-26reserved-3D0%26d%3DDwMFAg%26c%3D_hRq4mqlUmqpqlyQ5hkoDXIVh6I6pxfkkNxQuL0p-Z0%26r%3DfR3NG3FQThxTt7kSxn0Cbyc0K4D6v2RSlg4_V6UBIR4%26m%3D6Vz6WhABmefZ1c4jz0PPf_5gdZkEkI8pcIKFGG7TJS8%26s%3DpwNr1-0jO0v3KcmBchoo3Reb8DQ8jGifNks192ptsTM%26e%3D&amp;data=02%7C01%7Csvarukal%40microsoft.com%7Cd3a4b6c6d9e0447f6c5708d49141b8d1%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636293158842644218&amp;sdata=c3vyz9XUF%2BkkzukE6Bm0vN7HIJN4tcMsaVeZrP4Gimg%3D&amp;reserved=0">TechNet article</a><em>, This value may vary depending on how documents and folders are organized, and by the type and size of documents stored</em>. Note, this article is for SP 2013, but this limit is same in SPO too - as noted in the same article.

I highly recommend going with multiple document library approach. If documents can be divided into ‘n’ number of categories based on the metadata. Then create ‘n’ number of libraries and upload files to respective libraries. Irrespective of the number of libraries you go with, below are the high level steps that you will need to follow.

<strong>Preparation before uploading documents:</strong>

It is important that below steps are completed before uploading the documents to the library. This is because once you exceed the 5000 limit, you cannot add indexes, views or columns until and unless the total documents is reduced to &lt;5000.
<ol>
 	<li>Finalize the metadata (columns) for the documents. Plan beyond the already identified metadata in your CSV files. This post is based on assumption that you already have the metadata identified and its in a CSV file. Try to think ahead and add additional metadata columns, even if those are empty/placeholder column types.</li>
 	<li>In SharePoint site, create all the site columns corresponding to the metadata columns identified in Step 1.</li>
 	<li>Create Content Type. Add all the site columns created in Step 2 to the content type.</li>
 	<li>Create a single or multiple SP document libraries depending on the approach that’s decided. Associate the Content Type to the Document Library(ies).</li>
 	<li>Go the library settings, and add indexes for all of the Site Columns, that will be used to filter or sort the data by users. These columns will be used in Step 6 for creating views. Note that you can have max up to 20 indices in a list/library.</li>
 	<li>Plan and create as many Views as possible for the library. Make sure that the Filter or Sort conditions used for Views are set as Indexed columns. This is to avoid the 5000 item threshold limit. Also, limit the number of items shown in the View using the Item Limit property. If you are using nested folders, then you can leverage the ‘flat view’ property <strong>Show all items without folders </strong>while creating the views.</li>
 	<li>Another great and useful feature that you can leverage is the Metadata Navigation feature. You must first enable it by navigating to Site Settings – Manage Site Features and activate ‘Metadata Navigation and Filtering’ feature. Once enabled, it will add Key Filters panel to the left navigation whenever a user navigates to this library. It automatically manages indexes too. <strong>Note</strong>: Metadata navigation feature is not supported in Modern library experience. Once this feature is enabled, the library will automatically revert to Classic UI.</li>
 	<li>You might need additional prep work if you decide to use Search to let users find documents. See the last section in this email.</li>
</ol>
<strong>Upload documents</strong>:

There are multiple approaches to upload large number of files.
<ol>
 	<li>Although drag and drop works great, it’s not feasible for a large number of documents.</li>
 	<li>Use OneDrive for Business (ODB) Next Gen sync client to sync the library to a local machine and then copy all the files to the local machine ODB folder. Then ODB sync client will take care of syncing/uploading those files to the SP library.</li>
 	<li>Use Content Organizer feature – that will create a drop-off library, upload docs to this library and the documents will be routed to folders automatically. These folders are created automatically for every 5000 items.</li>
 	<li>Use PowerShell/CSOM to upload the documents, read the metadata from CSV and add metadata to the columns.</li>
 	<li>Steps 1 to 3, will require additional step to read the CSV and add the metadata to the columns</li>
</ol>
<strong>How does users consume these documents once uploaded to SharePoint</strong>:
<ol>
 	<li>Let users leverage the Views that’s created.</li>
 	<li>Let users use the Metadata navigation that can be helpful to filter and find data</li>
 	<li>Let search index the documents and use search center or provide custom page that is powered by search API. If planning to depend on search, you may need additional work:
<ol>
 	<li>Ensure all the crawled properties are mapped to managed properties. If new managed properties are created, then you must re-index the library.</li>
 	<li>It’s recommended to setup these mappings before uploading bulk of these documents.</li>
</ol>
</li>
</ol>]]></content:encoded>
    </item>
    <item>
      <title>Office Dev PnP PowerShell and the clash with Get-SPOSite cmdlet</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/office-dev-pnp-powershell-and-the-clash-with-get-sposite-cmdlet</link>
      <pubDate>Thu, 22 Sep 2016 02:57:57 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=185</guid>
      <description><![CDATA[Office Dev PnP PowerShell library provide a number of useful commandlets that comes handy when...]]></description>
      <content:encoded><![CDATA[Office Dev PnP PowerShell library provide a number of useful commandlets that comes handy when administering SharePoint Online.

As per the <a href="https://github.com/OfficeDev/PnP-PowerShell">instructions on GitHub</a>, you could easily install Office Dev PnP PowerShell cmdlets by running below PowerShell command:
<blockquote>
<pre><span class="pl-c1">Install-Module</span> SharePointPnPPowerShellOnline</pre>
</blockquote>
If this works without any issue then you are good and you can start using the awesome cmdlets. However, if you already have SharePoint Online Management Shell installed, then chances are that you will see an error that says something like:
<blockquote>A command with name 'Get-SPOSite' is already available on this system. To override this cmdlet use -AllowClobber.</blockquote>
The reason it is throwing this error because there is this one cmdlet (Get-SPOSite) that is common in both SPO PowerShell and Office Dev PnP PowerShell library. To avoid overriding of the SPO PowerShell Get-SPOSite cmdlet, I chose to install the Office Dev Pnp PowerShell using the <a href="https://github.com/officedev/pnp-powershell/releases">MSI package available here</a>. This completes installation of the library without issues.

If you now open the PowerShell command and try to execute one of PnP cmdlets, you will most probably see an error like:
<blockquote>import-module : The specified module ‘OfficeDevPnP.PowerShell.Commands’ was not loaded because no valid module file was found in any module</blockquote>
The reason for this is because you need a reboot of the machine so that the system picks up the Environment Variable: PSMODULEPATH that's automatically added when you installed the PnP library. This PSMODULEPATH points to the the below location containing the PnP library: C:\Users\&lt;UserId&gt;\AppData\Local\Apps\SharePointPnPPowerShellOnline\

If you have too many windows opened that you dont want to reboot or just lazy then you can explicitly load the PnP PowerShell module by running below cmd:
<blockquote>
<pre> Import-Module C:\Users\<span>&lt;UserId&gt;</span>\AppData\Local\Apps\SharePointPnPPowerShellOnline\Modules\SharePo
 intPnPPowerShellOnline</pre>
</blockquote>
Let's continue the Get-SPOSite ambiguity story. When you try to use Get-SPOSite or try to get help, you see that it always tries to use the PnP Powershell version of the Get-SPOSite. There are couple of ways to get around this and to use the Get-SPOSite of the SPO PowerShell library instead. To begin with, you can get help for the cmdlet by passing the module name qualifier as follows:
<blockquote>
<pre>Get-Help Microsoft.Online.SharePoint.PowerShell\Get-SPOSite

Get-Help SharePointPnPPowerShellOnline\Get-SPOSite</pre>
</blockquote>
To explicitly execute the Get-SPOSite from one of the modules, you do the similar thing again, by executing below cmds:
<blockquote>
<pre><span>Microsoft.Online.SharePoint.PowerShell\Get-SPOSite</span>

SharePointPnPPowerShellOnline\Get-SPOSite</pre>
</blockquote>
The second way to get around this is using the Prefix when importing the module. When importing Pnp Powershell I will add a prefix say "pnp", using below cmd:
<blockquote>
<pre>Import-Module <span>SharePointPnPPowerShellOnline -Prefix "pnp"</span></pre>
</blockquote>
Now, all the PnP powershell cmdlets can be access using the prefix pnp as below:
<blockquote>
<pre>Get-PnpSPOSite

Get-PnpSPOWeb and so on.</pre>
</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint Online incoming email alternatives</title>
      <link>https://docs.microsoft.com/archive/blogs/svarukala/sharepoint-online-incoming-email-alternatives</link>
      <pubDate>Fri, 27 May 2016 20:58:31 GMT</pubDate>
      <dc:creator><![CDATA[Srinivas Varukala]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/svarukala/?p=175</guid>
      <description><![CDATA[&nbsp;

Incoming email is one of the features that’s not available in SharePoint Online. Customer...]]></description>
      <content:encoded><![CDATA[&nbsp;

Incoming email is one of the features that’s not available in SharePoint Online. Customer with on-premises SharePoint deployments have been using incoming email since a long time and hits this feature gap when migrating to SharePoint Online. A quick search online shows that there are a number of third party solutions filling this gap. In this blog I just want to put forth the out of the box options and alternatives to incoming email in SharePoint Online. Here you go:
<ul>
 	<li>Site Mailbox ( <em>This is no more an option as SPO deprecated Site Mailbox feature as of July 2017 - Thank you for posting this info in the comments - Maruthachalam Krishnamurthy and Pramod Gupta </em>)
<ul>
 	<li>Site mailbox is available in the ‘Add an app’ page. So, its essentially an app that uses shared exchange mailbox foundation but users can interact with it within the SharePoint UI. Note that you can create only one Site Mailbox per SharePoint site. So, this is a limitation that you have to live with if you decide to go with Site Mailbox. You can create n number of subsites and create n number of site mailboxes if needed. Site mailboxes</li>
 	<li>Site mailbox name is created automatically. The naming convention is like this: <a href="mailto:SMO-SiteName@tenant.onmicrosoft.com">SMO-SiteName@tenant.onmicrosoft.com</a>. Replace the SiteName with the Site name in which the site mailbox is created. You can control the prefix though. The default prefix used is SMO. You can use the <a href="https://technet.microsoft.com/en-us/library/jj218624.aspx">Set-SiteMailboxProvisioningPolicy</a> Exchange OnlineWindows PowerShell cmdlet with the –AliasPrefix parameter to create a prefix to use with all new site mailboxes.</li>
</ul>
</li>
 	<li>Office 365 Groups
<ul>
 	<li>O365 groups is created at the tenant level (not at the site collection or site level). So a tenant admin must create the O365 group for you. Similar to Site mailbox this is based on the shared mailbox infrastructure. The way you access these groups are either through Outlook web app, Outlook or even OneDrive site (in the left nav).</li>
 	<li>The email address created can be of your choice unlike Site Mailbox.</li>
 	<li>Every O365 group created also creates a new Site Collection associated with it. These sites are hidden and are not listed (as of July 2017) in the SharePoint admin center. O365 groups uses this site to provide a shared document workspace, shared calendar, shared OneNote file and of course more.</li>
</ul>
</li>
 	<li>Microsoft Teams (<em>Thanks to Tom Nellikkan for posting this in comments</em>)
<ul>
 	<li>https://wonderlaura.com/2017/04/11/teams-incoming-email-in-sharepoint-online/</li>
</ul>
</li>
 	<li>Some other options that I am evaluating if viable are:
<ul>
 	<li>Office File Web Service - OfficeFile.asmx (Content Organizer)
<ul>
 	<li><a href="https://msdn.microsoft.com/en-us/library/aa981121(v=office.12).aspx">https://msdn.microsoft.com/en-us/library/aa981121(v=office.12).aspx</a></li>
</ul>
</li>
</ul>
</li>
 	<li>Azure Logic apps or Microsoft Flow
<ul>
 	<li>Either Flow or Logic Apps can be used to create a solution where it can monitor a shared exchange mailbox and trigger an action when there is an attachment to email and copy those files to a SPO site document library. You can use one of the existing templates in Flow.</li>
</ul>
</li>
</ul>]]></content:encoded>
    </item>
  </channel>
</rss>