💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## 库例子[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=1 "编辑小节:库例子")] * * * ### 数据验证[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=2 "编辑小节:数据验证")] 使用脚本,您可以检查输入数据的正确性,并拒绝保存未通过测试的数据。例如,可能只允许从0到200的字段整数值。 添加一个创建触发器 将事件设置为**创建一个新条目**,阶段为**在保存条目**之前。它将同步运行。 添加更新触发器 将事件设置为**更新条目**,将相位更改为**保存条目**之前。它将同步运行。 **触发脚本:** ~~~ var num = entry().field("Number"); // Get value of field Number //获取字段号的值 if (num 0 || num > 200) { // Test for value matching allowable range //测试值匹配的允许范围 message("Wrong range"); // If value is outside range, display message //如果值超出范围,则显示消息 cancel(); // Cancel the operation //取消操作 } ~~~ 设置默认值 如果默认值不能使用用户界面进行设置,可以使用脚本进行设置。 * * * ### 另一个字段的前一个值[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=3 "编辑小节:另一个字段的前一个值")] 假设有一个图书馆包含每日行走里程或使用汽车或自行车。假设图书馆有一个StartingMileage字段和一个Mileage字段。创建条目时,字段StartMileage必须从前一个条目中的字段Mileage中获取数据。 添加一个新的触发器 将事件设置为**创建一个条目**和阶段**打开条目编辑卡**。它将同步运行。 **触发脚本:** ~~~ var entries = lib().entries(); //获取当前库及其条目的数组 if (entries.length > 0) { //检查数组是否为空; //否则退出, //因为没有以前的条目。 prevMileage = entries[0].field("Mileage"); //数组从最新到最旧排序, //数组中最新的条目 //顶部索引为0。 entryDefault().set("StartMileage", prevMileage);//设置字段里程值 //来自上一个条目 //作为字段StartMileage的默认值。 } ~~~ * * * ### 第二天开始[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=4 "编辑小节:第二天开始")] 假设您需要在DateTime字段中标识新的一天的开始。 (该脚本需要连接JavaScript库**moment.js**[moment.js](http://momentjs.com/)。) 添加新的触发器 将事件设置为**创建条目**并将相位设为**打开条目编辑卡**。它将同步运行。 **触发脚本:** ~~~ var m = moment().add(1,'d'); //使用moment.js库函数moment(), //获取当前时间,并添加1天 m.hour(8).minute(0); //将时间设置为小时8和分钟0 entryDefault().set("Date", m.toDate().getTime()); //使用它作为Date字段的默认值 ~~~ * * * ===一个库中的新条目在另一个===中触发新条目 假设在新的成员资格申请被验证后,应该创建一个新成员。我们有图书馆应用程序和会员。在输入新的应用程序条目并保存之前,我们要验证应用程序,如果它通过,我们希望在成员中创建一个新条目。 领域 图书馆应用领域'*日期*,**名称**,城市,年份,城市,类型。 图书馆成员有字段**名称**和类型。 设置库许可权 应用程序库必须被允许通过*libByName()'访问其他库。 在触发器内,按下盾牌图标查看权限设置。* 添加新的触发器 添加一个新的触发器到应用程序库中。 设置事件**创建一个新条目**,阶段**在保存条目**之前。 (类似的触发器可以设置为事件**更新条目**阶段**在保存条目**之前,但只有当字段值的更改触发添加新成员时才会触发。 **触发脚本:** ~~~ //获取正在保存的应用程序条目并将其称为e //(因为你可能会用很多) //有了这个,你可以随时参考字段 //将在新的应用程序条目中保存 var e = entry(); //如果您对用户输入的字段值有任何检查, //你可以在这里做 //如果任何验证失败,请调用cancel()来阻止保存 //用户保留在条目编辑卡中 //并且会被告知应用程序不通过标准 if (e.field("Years in city") 2) { //示例字段验证 message("Application inadequate"); //你会想要更多 cancel(); //这将中止保存,但继续脚本 } else { //仅当应用程序足够时才添加新成员 //从这里开始,新的应用程序将被保存, //所以我们还必须创建新的成员条目 //要创建新成员,我们需要引用成员 var members = libByName("Members"); //这需要权限(请参阅上文) //为会员创建一个新条目 var newMember = new Object(); //从应用程序数据设置成员字段并添加新的成员条目 newMember ["Name"] = e.field("Name"); newMember ["Type"] = e.field("Type"); members.create(newMember); } ~~~ * * * ### 确保唯一的非名称字段值[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=5 "编辑小节:确保唯一的非名称字段值")] 目标是确保图书馆内特定的字段值是唯一的。 完成此操作的理想方法是将该字段设置为唯一的条目名称字段,然后将条目名称设置为唯一。然后,Memento将负责为您确保这一点。 为此,进入库编辑屏幕到库的MAIN选项卡,并打开开关"条目名称是唯一的"。然后转到FIELDS选项卡,并确保您的字段和只有该字段具有条目名称角色。通过编辑字段来实现这一点,并在显示选项下,你会看到"显示在列表中";选项将包括条目名称。 现在,如果您的图书馆需要其他条目名称,但您仍然希望确保图书馆中的其他字段是唯一的,那么,是的,您需要一些代码。 最好的方法是,如果您刚刚开始向库中输入条目,则从一开始就要确保它们是唯一的,因此从条目列表屏幕中,从菜单中选择"触发器"。按+(加号)按钮添加触发器,将事件设置为"创建新条目",将相位设置为"保存条目之前"。 字段 当前库中的字段—这是在图书馆的条目中独一无二的 - 是*myField*。 添加新的触发器 添加一个新的触发器到库中。 设置事件**创建一个新的条目**,阶段**在保存条目**之前。 (类似的触发器可能设置为事件**更新条目**阶段**在保存条目**之前,例如,如果该库已经具有其中*myField*可能不唯一的条目)。 **触发脚本:** ~~~ var myField = entry().field("myField"); // myField的值 var entries = lib().entries(); //包含所有条目的数组 var unique = true; //最初假设 for (var ent = 0; ent entries.length; ent++) { //遍历所有条目 if (entries[ent].field("myField") === myField) //如果有匹配, unique = false; // 记住它 } if (!unique) { //如果不唯一, cancel(); //不允许保存 message("myField is not unique. Try again."); //告诉用户 } ~~~ * * * ### 将复选框或多选字段的值复制到另一个库[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=6 "编辑小节:将复选框或多选字段的值复制到另一个库")] 假设您在My Today的活动资料库中使用复选框字段或多选字段来表示今天要开展的俱乐部活动计划—一组可以选择或不选择的活动。在特定的日子里,哪些项目将基于标准计划,可以从活动计划图书馆中通过链接到输入字段选择到该图书馆。 图书馆 我今天的活动—包含会员当天的计划。 活动计划—基本上是活动的可用计划菜单。 字段 我今天的活动—日期和成员,其他一些字段以及一个名为'*今日计划*的复选框字段。 活动计划—计划名称,说明和复选框字段**计划**(与今日计划相同的项目)以及与计划关联的选中活动。 添加新的触发器 添加两个新的触发器到库中。 设置事件**创建一个新条目**,阶段**保存条目**之前。 ~~~ var e = entry(); var links = e.field("Std Plans").length; if (links > 0) { //如果成员选择了一个标准计划 var linkedEntry = e.field("Std Plans")[0]; //第一个和唯一的条目 var todaysPlan = e.field("Today's Plan"); var stdPlan = linkedEntry.field("Plan"); var forSet = ""; for (var act in stdPlan) { if (forSet != "") forSet += ", "; //除第一次通过以外的逗号 forSet += stdPlan[act]; //只检查项目 } e.set("Plan", forSet); //将今日计划设置为所选标准计划中的值 } ~~~ 创建/之前触发器正确运行之后 添加另一个触发器,这次是事件**更新现有条目**和阶段**在保存条目**之前。然后将以前的脚本复制到剪贴板并粘贴到这个新的触发器中,以使它们相同,除了触发器名称和事件名称。 * * * ## 文件示例[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=7 "编辑小节:文件示例")] * * * ### 从文件中读取和读取[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=8 "编辑小节:从文件中读取和读取")] 添加触发器 该脚本可以是任何事件的任何阶段的一部分。 **触发脚本:** ~~~ f = file("/sdcard/myfile.txt"); //在SD卡上打开myfile.txt //如果没有文件,它将被创建 f.writeLine("one"); //将"one"作为一行写入文件 f.writeLine("two"); f.writeLine("three"); f.close(); //关闭并保存。在关闭之前, //文件仍然是空的 var a = f.readLines(); //将所有行读入数组a ~~~ * * * ### 将条目保存为XML格式的文件[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=9 "编辑小节:将条目保存为XML格式的文件")] 该条目包括字段:标识,标题,日期。 添加触发器 该脚本可以是任何事件的任何阶段的一部分。 **触发脚本:** ~~~ var xml = ' + entry().field("id") + '">' + //格式化XML记录 '' + entry().field("title") + '' + //来自输入字段值 '' + entry().field("date") + '' + ''; f = file("/sdcard/" + entry().field("title") + ".xml"); //文件名是条目名称 f.write(xml); //将XML数据保存到文件中 f.close(); //关闭文件 ~~~ * * * ## Http例子[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=10 "编辑小节:Http例子")] * * * ### 货币转换[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=11 "编辑小节:货币转换")] 假设库包含两个字段:PriceUSD和PriceEUR。 用户将在PriceUSD中输入价值,欧元价值将根据当前汇率显示在PriceEUR中。 添加新触发器 设置事件**创建一个新条目**和阶段**保存条目**后。它将异步运行。 **触发脚本:** ~~~ result = http().get("http://api.fixer.io/latest?base=USD"); //使用http://fixer.io/ for //在JSON中的转化率 usdToEur = JSON.parse(result.body)["rates"]["Eur"]; //使用JavaScript对象JSON //解析结果 entry().set("PriceEUR", entry().field( "PriceUSD") * usdToEur ); // PriceUSD *转化率 //用于PriceEUR的值 ~~~ * * * ### 在Todoist应用程序中创建一个任务[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=12 "编辑小节:在Todoist应用程序中创建一个任务")] [Todoist](https://todoist.com/) - 用于任务管理的Web服务和移动应用程序。 Todoist允许通过API [[1]](https://developer.todoist.com/)创建任务。 在下面的任务创建示例中,将从Memento库条目中获取文本。 添加新的触发器 将事件设置为**创建新条目**或者**更新条目**。适当设置阶段。 **触发脚本:** ~~~ //为Todoist任务创建创建一个JSON命令 //使用[https://develop.todoist.com/#add-an-item]中描述的格式。 //这个命令应该包含一个唯一的标识符 //使用guid()全局函数创建。 var commands = '[{"uuid":"' + guid() + '","temp_id":"' + guid() + '","type":"item_add","args":{"content":"' + entry().field("Task") + '"}}]'; //执行HTTP请求。使用称为'''标记'''的属性 //在Todoist中授权。 //它在Todoist帐户设置中可用。 //由于任务的文本可以包含符号 //在URL请求中不允许, //使用标准函数encodeURIComponent()将其过滤掉。 result = http().get("https://todoist.com/API/v7/sync?token=15281e8e4d499dаff817af0b14112eac3176f9dc&commands=" + encodeURIComponent(commands)); //向用户显示一条消息,指示成功创建任务。 if (result.code == 200) message('Task has been successfully created"); ~~~ * * * ## 系统示例[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=13 "编辑小节:系统示例")] * * * ### 打开屏幕拨打号码的脚本[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=14 "编辑小节:打开屏幕拨打号码的脚本")] 假设一个库包含一个名为Phone的字段,其中包含一个电话号码。 添加一个新的触发器 设置事件为**打开一个条目查看卡**,相位为**显示条目**后。 **触发脚本:** ~~~ i = intent("android.intent.action.DIAL"); //创建信息交换对象Intent //用DIAL的动作 i.data("tel:"+entry().field("Phone")); //数据将是获得的电话号码 //来自现场电话 i.send(); //发送消息 ~~~ * * * ### 打开应用程序发送短信的脚本[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=15 "编辑小节:打开应用程序发送短信的脚本")] 电话号码将从"电话"字段中获取,并且邮件的文本将从"联系人姓名"和"注释"字段中获取。 添加新的触发器 将事件设置为**打开条目查看卡**,阶段**显示条目**后。它将同步运行。 **触发脚本:** ~~~ msg = "亲爱的, " + entry().field("ContactName") + "\n" + entry().field("Notes"); //从ContactName&Notes中构建消息 i = intent("android.intent.action.SENDTO"); //创建意图对象来打开应用程序进行发送 i.data("smsto:"+entry().field("Phone")); //以smsto:number格式提供电话号码 i.extra("sms_body" , msg); //将消息的文本插入sms_body i.send(); //发送消息 ~~~ * * * ### 将约会插入Google日历的脚本[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=16 "编辑小节:将约会插入Google日历的脚本")] 假设一个库包含约会的时间和名称。 添加一个新的触发器 将事件设置为**创建一个新的条目**,阶段为**在保存条目**之前。它将同步运行。 **触发脚本:** ~~~ i = intent("android.intent.action.INSERT"); //创建Intent对象 i.data("content://com.android.calendar/events"); //数据包含Google日历URI i.extra("title", entry().field("Title")); //从字段标题获取事件名称 i.extra("description", entry().field("Description")); //从字段描述获取描述 i.extraLong("beginTime", entry().field("Begin").getTime()); //从字段获取开始时间开始 //开始是DateTime类型的 //附加参数的类型为Long, //所以extraLong()用于转换。 i.extraLong("endTime", entry().field("End").getTime()); //从字段End得到结束时间 //需要与上述相同的转换 i.send(); //发送消息 ~~~ * * * ## 内置对象示例[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=17 "编辑小节:内置对象示例")] * * * ### 示例:从联系人字段中提取组件到不同的字段[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=18 "编辑小节:示例:从联系人字段中提取组件到不同的字段")] 假设您有一个名为myContact的联系人字段。如果您想将名称,主要电话和主要电子邮件作为单独的字段,请创建字段,可能为ContactFullname,ContactPrimaryPhone和ContactPrimaryEmail。创建两个触发器,如下所示: CreateBefore 事件:创建一个新条目 阶段:保存条目之前 脚本:如下 ~~~ var e = entry(); var contact = e.field("myContact"); e.set("ContactFullname", contact.fullName); e.set("ContactPrimaryPhone", contact.phone); e.set("ContactPrimaryEmail", contact.email); ~~~ UpdateBefore 事件:更新现有条目 其余与上述相同。 现在,每当您创建新条目或更新现有条目时,联系信息将被提取到单独的字段。 ### 示例:从Location字段提取坐标到Real字段[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=19 "编辑小节:示例:从Location字段提取坐标到Real字段")] 假设您有一个名为myLocation的位置字段。如果您希望将坐标设置为实际字段,请创建实际字段,可能是LocationLatitude和LocationLongitude。创建两个触发器,如下所示: CreateBefore 事件:创建一个新条目 阶段:保存条目之前 脚本:如下 ~~~ var e = entry(); var loc = e.field("myLocation"); e.set("LocationLatitude", loc.lat); e.set("LocationLongitude", loc.lng); ~~~ UpdateBefore 事件:更新现有条目 其余与上述相同。 现在,每次创建新条目或更新现有条目时,myLocation的坐标都将被提取到实数字段。 * * * ## 请参阅[[编辑](http://www.jsaaa.cc/app/mementodatabase/index.php?title=%E8%A7%A6%E5%8F%91%E5%99%A8%E7%A4%BA%E4%BE%8B&action=edit&section=20 "编辑小节:请参阅")] [触发器](http://www.jsaaa.cc/app/mementodatabase/index.php/%E8%A7%A6%E5%8F%91%E5%99%A8 "触发器") 关于Memento触发器的基本信息 [Memento JavaScript 库](http://www.jsaaa.cc/app/mementodatabase/index.php/Memento_JavaScript_%E5%BA%93 "Memento JavaScript 库") Memento JavaScript函数和对象 [提示:在纪念品中使用JavaScript](http://www.jsaaa.cc/app/mementodatabase/index.php/%E6%8F%90%E7%A4%BA%EF%BC%9A%E5%9C%A8%E7%BA%AA%E5%BF%B5%E5%93%81%E4%B8%AD%E4%BD%BF%E7%94%A8JavaScript "提示:在纪念品中使用JavaScript") 在Memento中使用JavaScript的提示