Database 如何在ScriptDb中避免重复?
我有一些对象要保存在数据库中,但是每次执行脚本时它们都必须是唯一的。这些对象只会更改应用程序的每个实例的值。问题是,当我创建第一个对象时,每次之后执行脚本时都会创建更多副本。我尝试再次使用同一个对象,但是当我执行查询时,我从以前的执行中得到的对象给了我错误的值。我只希望能够将相同的对象重置为它们的默认值,并且在ScriptDb中没有许多不必要的副本 下面是一些代码:Database 如何在ScriptDb中避免重复?,database,google-apps-script,javascript-objects,Database,Google Apps Script,Javascript Objects,我有一些对象要保存在数据库中,但是每次执行脚本时它们都必须是唯一的。这些对象只会更改应用程序的每个实例的值。问题是,当我创建第一个对象时,每次之后执行脚本时都会创建更多副本。我尝试再次使用同一个对象,但是当我执行查询时,我从以前的执行中得到的对象给了我错误的值。我只希望能够将相同的对象重置为它们的默认值,并且在ScriptDb中没有许多不必要的副本 下面是一些代码: // Get a database instance var database = getDb(); // Create a n
// 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”的字符串元素。为了避免在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.
...
你能显示你正在使用的代码吗?添加了代码。希望你能帮助我,但仍然不清楚你是如何从数据库中编辑元素的。如果你想编辑数据库中的某些内容,你必须先检索它,然后进行更改并重新保存。我知道我必须这样做。但是,一旦我将元素保存到数据库中,它们就会被一次又一次地创建。每次我运行脚本时都会有更多的元素。我不想要更多。我只想覆盖我以前保存的那些。如果这是你想要做的,那么你必须调用
var obj=db.query({element:elemName})。next()
然后做你必须做的任何事情来编辑obj
,并用db.save(obj)
完成它。不要重新定义新对象并将其保存到数据库中,因为这将在数据库中创建新项。