ListItem にさまざまな「フィールド」を挿入または更新するために、この Sharepoint (2010) Javascript (ここから適応) があります。
var listId;
. . .
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
listId = this.oListItem.ID;
oListItem.set_item('ptli_formFilledOut', new Date());
oListItem.set_item('ptli_TravelersName', $('travelername').val());
. . .
oListItem.update();
clientContext.load(oListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
上記のコードでは、最初の「upsert」が「listId」を格納します。リストへの後続の書き込み (ユーザーが停止した場合、または何かが停止し、後で戻ってきた場合に備えて、ピースごとに書き込まれます) getItemById() メソッドを使用して、以前に ListItem を開始したことを取得します。
function upsertPostTravelListItemTravelerInfo2() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.oListItem = oList.getItemById(listId);
oListItem.set_item('ptli_tripNumber', $('tripnumber').val());
. . .
私の課題は、ユーザーが上記の 2 つのメソッド (upsertPostTravelListItemTravelerInfo1()) の最初の部分でデータの最初のビットを更新したい場合 (それらを挿入し、後で戻ってきて何かを変更することを決定した場合) です。
ここでも getItemById() を使用する必要があります。これが最初のエントリの場合、まだ存在していないので、次を使用します。
listId = this.oListItem.ID;
...しかし、この部分が更新されると、listId が必要になるので、次のことができます。
this.oListItem = oList.getItemById(listId);
これを行うには、正しい値を listId に割り当てるために、リストを調べて、特定の値の「レコード」が既に存在するかどうか、つまり listId が既に存在するかどうかを確認する必要があります。疑似コード:
listId = //a "record" with a username value of "<userName>" and a payeeName of "<payeeName>" with a "Completed" value of "false")
if (listId == null) {
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
listId = this.oListItem.ID;
} else {
this.oListItem = oList.getItemById(listId);
}
私の質問は、その疑似コードを何に置き換える必要があるかです。Sharepoint 2010 ListItem は、特定の ListItem メンバー値に一致する「レコード」を検索するために、クエリのようにどのように問い合わせられますか?
アップデート
crclayton の最初のアイデアに基づいて、私は次のように考えています。
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.website = context.get_web();
this.currentUser = website.get_currentUser();
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
var travelersEmail = $('traveleremail').val());
/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem. */
listId = getListItemID(currentUser, travelersEmail);
if (listId === '') {
listId = this.oListItem.ID;
}
oListItem.set_item('ptli_formFilledOut', new Date());
oListItem.set_item('ptli_TravelersName', $('travelername').val());
oListItem.set_item('ptli_TravelersEmail', travelersEmail);
. . .
}
function getListItemID(username, payeename) {
var arrayListEnum = oList.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if(listItem.get_item("ptli_formPreparedBy") === username &&
listItem.get_item("ptli_TravelersEmail") === payeename &&
listItem.get_item("ptli_formCompleted") == false) {
return listItem.get_id();
}
}
return '';
}
...チケットかもしれません。
更新 2
答えから、次の行にエラー メッセージが表示されます。
var arrayListEnum = oList.getEnumerator();
つまり、「キャッチされていない TypeError: oList.getEnumerator は関数ではありません」
getEnumerator()という名前のそのような関数がない場合ですか、それとも...???
更新 3
この(変更された)コードでは、「Uncaught TypeError: oList.getEnumerator is not a function」というメッセージが表示されます。
function getListItemID(username, payeename, oList) {
var clientContext = new SP.ClientContext.get_current();
var listItems = oList.getItems("");
clientContext.load(listItems);
clientContext.executeQueryAsync(function () {
var arrayListEnum = oList.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if (listItem.get_item("userName") === "<userName>" &&
listItem.get_item("payeeName") === "<payeeName>" &&
listItem.get_item("Completed") == false) {
return listItem.get_id();
}
}
return '';
});
}
私はこのように呼んでいます:
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = SP.ClientContext.get_current();
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.website = clientContext.get_web();
currentUser = website.get_currentUser();
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
var travelersEmail = $('traveleremail').val();
/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem. */
listId = getListItemID(currentUser, travelersEmail, oList);
if (listId === '') {
listId = this.oListItem.ID;
}
getEnumerator() は有効な関数ですか? はいの場合、何が間違っていますか? そうでない場合、代わりに何を使用できますか?