0
我有一個函數可以存儲大量數據,然後在存儲更多數據之前檢查數據是否有重複。查詢每個重複檢查的數據庫會導致腳本超出最大執行時間,因此查詢整個數據庫,然後檢查該查詢。問題是,當我通過重複檢查運行時,查詢大小在第四次通過時減小到零,使其無效。下面是存儲功能的代碼,並重複檢查:ScriptDb遞減查詢
function ssToScriptDb_1() {
var spreadsheet = SpreadsheetApp.openById('0Ah1c1zmu5vU_dEZJYVMzVnF6Y211cmJGdjZBUGFLQWc'); // **** create a function to prompt for the ID
var sheet = spreadsheet.getActiveSheet();
var columns = spreadsheet.getLastColumn();
var data = sheet.getDataRange().getValues();
var keys = data[0];
var db = ScriptDb.getMyDb();
var allDb = db.query({});
var items = [];
for (var row = 1; row < data.length; row++) {
var rowData = data[row];
var item = {};
for (var column = 0; column < keys.length; column++) {
item[keys[column]] = rowData[column]; // ???? could I use this notation in place of the double for loops in timeClock?
}
item.visitDate = Utilities.formatDate(item.visitDate, "MST", "M/d/yyyy");
// check to see if the item is already in the db
if (dupCheck(db, allDb, item)) {
items.push(item);
}
if (row % 1000 == 0) {
Logger.log("row " + row + " completed at " + new Date() +"\n");
}
}
var itemsLen = items.length;
Logger.log('DB save start time ' + new Date() + '\n');
var results = db.saveBatch(items, false);
Logger.log('DB save end time ' + new Date() + '\n');
}
function dupCheck(db, query, item) {
var count = 0;
var querySize = query.getSize();
var query2Size = db.query({}).getSize();
while (query.hasNext()) {
var ob = query.next();
if (ob.ID == item.ID && ob.email == item.email && ob.visitDate == item.visitDate) {
return false;
}
count++;
}
return true;
}
首次通過調試dupCheck()
看起來是這樣的:
通知,querySize
是進入dupCheck()
和query2Size是之前完成的查詢在dupCheck()
內完成相同的查詢。
這裏是第二次通過dupCheck()
:
這裏是第4關:
再次注意到querySize
VS query2Size
。
我不知道是什麼導致原始查詢減少,但我不能調用每個項目的查詢,任何想法是什麼導致這個或有更好的解決方案?