0

データベースに保存するオブジェクトがいくつかありますが、スクリプトが実行されるたびに一意である必要があります。これらのオブジェクトは、アプリケーションのインスタンスごとに値を変更するだけです。問題は、最初のオブジェクトを作成すると、その後スクリプトが実行されるたびに、さらに多くのコピーが作成されることです。同じオブジェクトをもう一度使用しようとしましたが、クエリを実行すると、以前の実行からオブジェクトが取得され、間違った値が返されます。同じオブジェクトをデフォルト値にリセットし、ScriptDbに不要なコピーを多く含まないようにしたいだけです。

ここにいくつかのコードがあります:

// Get a database instance
var database = getDb();

// Create a new employee instance
var myEmployee = {
element: "currentEmployee",
firstName: "",
lastName: "",
ID: 0,
manager: "",
managerEmail: "",
department: "1 - University Store",
startDate: "",
endDate: "",
regularHours: 0,
vacationHours: 0,
sickHours: 0,
personalHours: 0,
H2Hours: 0,
overtimeHours: 0,
totalHours: 0,
rowLocation: 0,
salaryType: "H",
};

var week1 = {
// Identify the week and for query purposes 
element: "Week1",

// User entries
HW: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
VH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
SH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
PH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
TH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},

// Calculated totals
TotalHW:0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

// Week totals
Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
}

var week2 = {
// Identify the week and for query purposes 
element: "Week2",

// User entries
HW: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
VH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
SH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
PH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
TH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},

// Calculated totals
TotalHW:0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

// Week totals
Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
}

// Save these to the database
database.save(myEmployee);
database.save(week1);
database.save(week2);

次に、ステートメントScriptDb.getMyDb.query({element: element}).next()を使用してオブジェクトを取得します。「currentEmployee」、「Week1」、または「Week2」を含む文字列要素。

4

1 に答える 1

1

ScriptDbで一意のキーを持つオブジェクトが再作成されないようにするには、最初に、保存しようとしているオブジェクトがすでに存在するかどうかを確認する必要があります。そうである場合は、更新に使用するために保存されたオブジェクトのハンドルを取得する必要があります。そこにない場合はsave()、新しいオブジェクトになり、戻り値はデータベース内のコピーのハンドルになります。

一般的なパターンは次のとおりです。

// Get a database instance
var db = getDb();

var result = db.query( {key:keyval, ...} );
if (result.hasNext()) {
  // The object already exists in ScriptDb
  var obj = result.next()
}
else {
  // The object doesn't exist in ScriptDb, so create it
  // This example would start by creating only the key values,
  // expanding the object during the update stage below.
  // Alternatively, you could create the entire object with all
  // its properties.
  obj = db.save({key:keyval, ...})
}

// Can now update the obj that is in ScriptDb
obj.prop1 = value1;
obj.prop2 = value2;
...

// Save updated object
db.save(obj);

このパターンをコードに適用する方法の例を次に示します。ここでは、新しいオブジェクトを作成するための代替アプローチが使用されていることがわかります。このアプローチでは、新しいオブジェクトがすべてのプロパティとともにScriptDbで一度に作成されます。

// Get a database instance
var database = getDb();

// Find or create employee instance
var result = database.query({element: "currentEmployee"});
if (result.hasNext()) {
  var myEmployee = result.next();
} else {
  myEmployee = database.save({
    element: "currentEmployee",
    firstName: "",
    lastName: "",
    ID: 0,
    manager: "",
    managerEmail: "",
    department: "1 - University Store",
    startDate: "",
    endDate: "",
    regularHours: 0,
    vacationHours: 0,
    sickHours: 0,
    personalHours: 0,
    H2Hours: 0,
    overtimeHours: 0,
    totalHours: 0,
    rowLocation: 0,
    salaryType: "H"
  });
};

// Find or create Week1 instance
result = database.query({element: "Week1"});
if (result.hasNext()) {
  var week1 = result.next();
} else {
  week1 = database.save({
    // Identify the week and for query purposes 
    element: "Week1",

    // User entries
    HW: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    VH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    SH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    PH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    TH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},

    // Calculated totals
    TotalHW: 0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

    // Week totals
    Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
  });
}

// Find or create Week2 instance
result = database.query({element: "Week2"});
if (result.hasNext()) {
  var week2 = result.next();
} else {
  week2 = database.save({
    // Identify the week and for query purposes 
    element: "Week2",

    // User entries
    HW: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    VH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    SH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    PH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    TH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},

    // Calculated totals
    TotalHW: 0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

    // Week totals
    Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
  });
}

// At this point, myEmployee, week1 and week2 refer to the ScriptDb objects.
// While we can use them as any javascript object, they also contain information
// relevant to their state as ScriptDb objects.
...
于 2013-08-24T03:48:39.240 に答える