The SPServices discussions are a fount of interesting information. I find myself answering all sorts of questions which, while connected to SPServices, are often just as much about how SharePoint works in general. I had two questions recently about how to update Lookup columns with UpdateListItems, and I thought they would be of general interest.
Lookup column values are stored in the format “n;#Text Value”, where n is the ID of the value in the reference list and “Text Value” is, well, the text value of the Lookup column. There are probably some good historical reasons for this having to do with Office compatibility, if you think about it. Just storing the text value means that you lose the connection to the original item in the reference list, and just storing the ID for the item would mean that you’d need expensive calls to the database every time you wanted to display the value. As for the ‘;#’ delimiter, you see that sprinkled throughout how SharePoint stores data values. It’s probably related to some very old standard of some sort, but in any case it’s highly likely to be a unique string which no one will use in their text values, so it’s a reasonable delimiter.
Update a Lookup Column Value
The first question was how to update a Lookup column value. The code for this in SPServices is pretty straightforward; the tricky bit is knowing how to structure your value.
In this example, the State column in Sales Opportunities is a Lookup column to the Title column in a list called States.
$().SPServices({ operation: "UpdateListItems", async: false, debug:true, listName: "Sales Opportunities", ID: 5, valuepairs: [["State", "2;#Rhode Island"]], completefunc: function (xData, Status) { alert(xData.responseText); } });
It also works fine to just specify the index:
valuepairs: [["State", "2"]],
The trick is knowing what the right index is. You’ll need to figure that out by calling GetListItems on the reference list or by using some other method.
“Emptying” a Lookup Column Value
The second question was how to “empty”, or remove, a previously set value in a Lookup column.
$().SPServices({ operation: "UpdateListItems", async: false, debug:true, listName: "Sales Opportunities", ID: 5, valuepairs: [["State", ""]], completefunc: function (xData, Status) { alert(xData.responseText); } });
It’s important to keep in mind that when you are interacting with SharePoint’s XML (SOAP) Web Services, *all* of the traffic back and forth is text. There’s no such thing as a null
or some of the other datatypes you might be used to in other ways of interating with the API. An empty string [""] in text essentially *is* a null; it represents “no value”.
I wish that I could say that this little tip was foolproof in interacting with all of SharePoint’s Web Services, but I can’t. There is a *lot* of internal inconsistency across the Web Services, and in some cases, even among operations in the same Web Service. If you want to set other values to “empty” or “null”, you may need to experiment to see what works. I didn’t write ‘em; I just wrapped ‘em! Note that the line:
alert(xData.responseText);
can be an absolute lifesaver. It will alert what has come back from the server as a response to the Web Service call. Even if the AJAX request is successful (Status=”success”), there may be useful (or totally indecipherable) error information in the response.