我的代碼在我的日歷中搜索用戶指定的搜索詞并回傳相關結果。我希望能夠搜索多個術語。例如,“Arnold Schwartzeneger”和“Bruce Willis”和“Sylvester Stallone”。可以添加一個回圈來一次搜索一個范圍內列出的每個術語嗎?
function export_gcal_to_gsheet(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var sh0 = sheet.getSheets()[0];
var sh1 = sheet.getSheets()[1];
var mycal = sh0.getRange("B1").getValue();
var cal = CalendarApp.getCalendarById(mycal);
var search1 = sh0.getRange("B2").getValue();
var events = cal.getEvents(new Date("January 12, 1990 00:00:00 EST"), new Date("May 18, 2050 23:59:59 EST"), { search: (search1) });
var range = sh1.getRange(1,1,1,14);
for (var i=0;i<events.length;i ) {
var row=i 1;
var details=[[mycal,events[i].getTitle(), events[i].getDescription(), events[i].getStartTime(), events[i].getLocation()]];
var range=sh1.getRange(row,1,1,5);
range.setValues(details);
}}
uj5u.com熱心網友回復:
您可以使用 array.includes() 方法。所以這應該適合你的需要。您當然可以從作業表中獲取值。要獲得一維陣列,請確保.flat()在.getValues()-->之后添加,.getValues().flat()區分大小寫。
function export_gcal_to_gsheet() {
const searchValues = ["Arnold Schwartzeneger", "Bruce Willis", "Sylvester Stallone"];
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var sh0 = sheet.getSheets()[0];
var sh1 = sheet.getSheets()[1];
var mycal = sh0.getRange("B1").getValue();
var cal = CalendarApp.getCalendarById(mycal);
var search1 = sh0.getRange("B2").getValue();
var events = cal.getEvents(new Date("January 12, 1990 00:00:00 EST"), new Date("May 18, 2050 23:59:59 EST"), { search: (search1) });
var range = sh1.getRange(1, 1, 1, 14);
for (var i = 0; i < events.length; i ) {
if (searchValues.includes(events[i].getTitle())) {
var details = [[mycal, events[i].getTitle(), events[i].getDescription(), events[i].getStartTime(), events[i].getLocation()]];
var range = sh1.getRange(sh1.getLastRow() 1, 1, 1, 5);
range.setValues(details);
}
}
}
uj5u.com熱心網友回復:
這不是專門針對您的答案,但由于您的問題,我今天有動力寫下它。它使用我在其上構建搜索表單的作業表。當我構建表單時,我會獲取所有日歷并將名稱放在旁邊帶有復選框的列中,以便我可以檢查我想要參與搜索的日歷。
當我執行搜索時,我會閱讀此串列并過濾未選中的串列,然后使用它來運行以下回圈:
calA.forEach(c => {
evts = evts.concat(CalendarApp.getCalendarById(c).getEvents(fmdt, todt, { search: query }));
});
在上面的代碼中,c 是一個 calendarId。
這是執行搜索的完整功能。我沒有包括保存原始模板的功能或在活動頁面上創建新表單的功能,從而可以擁有多個搜索表單。
/*
Performs a calendar based update in the form
*/
function calendarSearchForm() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getActiveSheet();
const cals = CalendarApp.getAllCalendars();
const locations = JSON.parse(getGlobal('locations'));
const row = locations.origins.status.row;
const col = locations.origins.status.col;
sh.getRange(row, col).setValue(`Search Initiated`);
let isChecked = {};
let calName = {};
let found = 0;
sh.getRange(locations.origins.calendar.select.row, locations.origins.calendar.select.col, cals.length, 2).getValues().forEach(r => isChecked[r[1]] = r[0]);
const calA = cals.map(c => {
let name = c.getName();
let id = c.getId();
if (isChecked[name]) {
calName[id] = name;
return id;
}
}).filter(e => e);
let calendars = (calA && calA.length) ? calA.length : 0;
let query = sh.getRange(locations.origins.query.row, locations.origins.query.col).getDisplayValue();
let fmdt = new Date(sh.getRange(locations.origins.fromdate.row, locations.origins.fromdate.col).getValue());
let todt = new Date(sh.getRange(locations.origins.todate.row, locations.origins.todate.col).getValue());
let start = `${fmdt.getMonth() 1}/${fmdt.getDate()}/${fmdt.getFullYear()}`;
let end = `${todt.getMonth() 1}/${todt.getDate()}/${todt.getFullYear()}`;
sh.getRange(row, col).setValue(`Searching...\nFrom: ${start}\nTo: ${end}\nQuery: ${query}\nCalendars:${calendars}`);
//Logger.log("calName: " JSON.stringify(calName));
//Logger.log("calA: " JSON.stringify(calA));
//Logger.log("isChecked:\n" JSON.stringify(isChecked));
//Logger.log("fromdate: \n" fmdt);
//Logger.log("todate:\n" todt);
//Logger.log("query:\n" query);
let evts = [];
let cobj = {};
calA.forEach(c => {
evts = evts.concat(CalendarApp.getCalendarById(c).getEvents(fmdt, todt, { search: query }));
});
let evA = evts.map(e => {
return [e.getId(), e.getTitle(), e.getStartTime(), calName[e.getOriginalCalendarId()]];
}).sort((a,b) => new Date(a[2]).valueOf()-new Date(b[2]).valueOf());
let idrow = locations.origins.results.id.row;
let idcol = locations.origins.results.id.col;
let rows = getColumnHeight(locations.origins.results.id.col, sh, ss) - idrow 1;
let cols = locations.origins.results.calendar.col - idcol 1;
if (rows) {
sh.getRange(idrow, idcol, rows, cols).clearContent();
}
if (evA && evA.length) {
sh.getRange(locations.origins.results.id.row, locations.origins.results.id.col, evA.length, evA[0].length).setValues(evA);
found = evA.length;
}
sh.getRange(row, col).setValue(`Complete...\nFrom: ${start}\nTo: ${end}\nQuery: ${query}\nCalendars:${calendars}\nFound: ${found}`);
ss.toast(`EOF\nFound: ${found}`);
}
我的猜測是,有很多人做過比這更優雅的腳本,老實說,直到今天我什至從未在日歷上使用過搜索功能。如果有幫助,那就太好了。如果您希望我洗掉它,請告訴我。
搜索表單模板:

從任何選項卡上的模板構建的搜索表單:

我修改了其中一個日歷的名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/325148.html
