LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

2018年2月27日火曜日

JIS第1水準〜第4水準漢字一覧を一行にする

JIS第1水準〜第4水準漢字をまとめて一行にしたものです

漢字に一致させる正規表現を作る過程で書き出した副産物です


JIS第1水準〜第4水準漢字
㐂㐆㐬㐮㑨㑪㒒㒵㒼㓁㓇㓛㔟㕝㕞㕣㕮㖦㖨㗅㗚㗴㘅㙊㚑㚖㚙㛏㝡㝢㝫㝬㝵㞍㟁㟢㟨㟴㟽㠀㠯㠶㡀㡜㡡㣺㤗㤚㥯㩮㩳㫖㫗㫪㬎㬚㬜㬢㭭㭷㮇㮈㮍㮤㮶㯃㯍㯰㰏㰦㳃㳒㴑㴞㵤㶚㷀㷔㸅㸿㹠㹦㹨㺃㺔㽗㽲㽵㽷㾮㿉㿗䀹䁘䂓䄅䅈䅏䅣䆴䆿䇦䇮䇳䈇䈎䉤䋆䋖䋝䌂䌫䍃䏮䏰䐈䐗䐜䐢䑓䑛䑶䑺䒑䒳䒾䓔䔈䔍䔥䕃䖝䖸䗥䗪䘏䙁䙥䚡䚯䜌䝤䟽䠖䡄䡎䢵䦰䧧䧺䨄䨩䪼䬻䯂䯊䯒䯨䰗䰠䳄䳑䴇䵷一丁丂七万丈三上下不与丏丐丑丒且丕世丗丘丙丞両並丨丩个丫丬中丮丯丰丱串丶丸丹主丼丿乀乂乃久乇么之乍乎乏乑乕乖乗乘乙乚九乞也乢乩乱乳乾亀亂亅了予争亊事二亍于云互五井亘亙些亜亝亞亟亠亡亢交亥亦亨享京亭亮亰亳亶亹人亻亼什仁仂仃仄仆仇仈今介仍从仏仐仔仕他仗付仙仚仞仟仡代令以仫仭仮仰仱仲仵件价任份仿伀企伃伉伊伋伍伎伏伐休伖会伜伝伯估伴伶伷伸伺似伽伾佃但佇佈佉位低住佐佑体佔何佖佗佘余佚佛作佝佞佟你佤佩佪佬佯佰佳併佶佷佸佺佻佼佽佾使侂侃侅來侈侊例侍侏侑侒侔侖侗侘侚供依侠価侫侭侮侯侲侵侶侾便係促俄俅俉俊俋俎俏俐俑俒俔俗俘俚俛保俟俠信俣俤俥俦修俯俱俲俳俵俶俸俺俾倀倁倂倅倆倉個倍倎倏倐們倒倓倔倖倘候倚倜倞借倡倢倣値倥倦倧倨倩倪倫倬倭倮倶倹倻偀偁偂偃偆假偈偉偎偏偐偓偕偖偗做停偣健偦偪偬偰偲側偵偶偸偽傀傅傈傍傑傒傓傔傕傖傘備傚傜傣傪催傭傱傲傳傴債傷傺傻傾僂僄僅僇僉僊僌働僎像僐僑僔僕僖僙僚僞僡僣僥僦僧僩僭僮僲僳僵價僻儀儁儂儃億儆儈儉儋儒儔儕儖儗儘儚儛儞償儡優儲儵儷儺儻儼儿兀允元兄充兆兇先光兊克兌免兎児兒兔兕兗党兜兠兢入全兩兪八公六兮共关兵其具典养兼冀冂冃内円冉冊冋册再冏冐冑冒冓冕冖冗冘写冝冠冢冣冤冥冦冨冩冪冫冬冭冰冱冲决冴况冶冷冼冽凃凄凅准凉凊凋凌凍凖凛凜凝凞几凡凢処凧凩凪凭凮凰凱凳凴凵凶凸凹出函凾刀刁刂刃刄分切刈刊刋刎刑划刓刔刕刖列初判別刧利刪刮到刳制刷券刹刺刻剃剄則剉削剋剌前剏剔剕剖剗剛剜剝剞剡剣剤剥剩剪剬副剰剱割剳剴創剷剽剿劂劃劄劇劈劉劍劑劒劓劔劘力功加劣劤劦助努劫劬劭劯励労劵効劺劻劼劾勁勃勅勇勈勉勊勌勍勐勑勒動勖勗勘務勛勝勞募勠勢勣勤勦勧勰勲勳勵勷勸勹勺勻勾勿匀匁匂包匆匇匈匊匋匍匏匐匕化北匙匚匜匝匠匡匣匤匪匯匱匳匵匸匹区医匾匿區十卂千卅卆升午卉半卍卑卒卓協南単博卜卞占卡卣卦卧卩卬卮卯印危即却卵卷卸卺卻卽卿厂厄厓厖厘厚厝原厠厤厥厦厨厩厭厮厰厲厳厴厶厷去叀参參又叉及友双反収叔叕取受叙叚叛叟叡叢口古句叨叩只叫召叭叮可台叱史右叴叵叶号司叺吁吃各合吉吊吋同名后吏吐向吒君吝吞吟吠吤否吧吨吩含听吭吮吶吸吹吻吼吽吾呀呂呃呆呈呉告呍呎呑呕呟呢呦周呪呫呬呰呱味呴呵呶呷呻呼命呿咀咄咆咈咊咋和咍咎咏咐咒咕咖咜咠咡咢咤咥咦咨咩咫咬咭咮咯咲咳咷咸咺咼咽咾咿哀品哂哃哄哆哇哈哉哘員哢哥哦哨哩哬哭哮哯哱哲哳哺哽哿唀唁唄唆唇唉唎唏唐唔唖唫售唯唱唳唵唸唹唼唾啀啁啄啅商啇啊啌問啐啓啖啗啜啝啞啠啡啣啤啻啼啽啾喀喁喂喃善喆喇喈喉喊喋喎喑喘喙喚喜喝喞喟喧喨喩喪喫喬喭單喰営喿嗄嗅嗇嗉嗌嗎嗑嗒嗔嗚嗜嗝嗟嗢嗣嗤嗩嗷嗹嗽嗾嘆嘇嘈嘉嘎嘐嘔嘖嘗嘘嘛嘨嘩嘯嘰嘱嘲嘴嘶嘷嘸嘻嘽嘿噀噂噇噉噌噎噐噓噛噞噠噤噦器噪噫噬噭噯噱噲噴噶噸噺嚀嚆嚇嚈嚊嚌嚏嚔嚕嚙嚚嚝嚞嚠嚢嚥嚨嚩嚬嚭嚮嚲嚳嚴嚶嚼囀囁囂囃囅囈囉囊囍囎囑囓囗囘囚四回囟因団囨囮困囲図囶囷囹固国囿圀圃圄圈圉圊國圍圏園圓圕圖團圜土圡圣圦圧在圩圭圯地圳圴圷圸圻址坂坅坆均坊坌坍坎坏坐坑坡坤坦坨坩坪坯坰坳坴坵坷坻坼坿垂垈垉型垓垚垜垝垞垠垢垣垤垨垪垬垰垳垸埀埃埆埇埈埋埌城埏埒埓埔埖埗埜埞域埠埣埤埦埭埰埴埵埶執埸培基埻埼埽埿堀堂堄堅堆堉堊堋堕堙堝堞堠堡堤堧堪堯堰報堲場堵堹堺堽塀塁塉塊塋塌塑塒塔塗塘塙塚塞塡塢塤塧塩填塰塲塵塹塼塾境墅墉墊墋墍墏墐墓墔増墜墝增墟墨墩墪墫墮墱墳墸墹墺墻墾壁壃壅壇壊壌壍壎壑壒壓壔壕壗壘壙壚壜壞壟壠壢壤壥壩士壬壮壯声壱売壳壴壷壹壺壻壼壽夂夅夆変夊夋夌复夏夐夔夕外夘夙多夛夜夢夤夥大天太夫夬夭央失夲夷夸夽夾奄奆奇奈奉奎奏奐契奔奕套奘奚奛奝奟奠奢奥奧奨奩奪奬奭奮女奴奵奶奸奼好妁如妃妄妊妋妍妒妓妖妙妛妝妟妣妤妥妨妬妮妲妹妻妼妾姃姆姈姉始姍姐姑姒姓委姙姚姜姝姞姣姤姥姦姧姨姪姫姮姶姸姻姿威娃娉娌娍娑娓娗娘娚娜娟娠娣娥娧娩娭娯娵娶娼婀婁婆婉婕婚婢婥婦婧婪婬婭婷婺婾婿媄媋媒媚媛媜媞媟媠媢媧媱媳媵媺媼媽媾媿嫁嫂嫄嫉嫋嫌嫐嫖嫗嫚嫜嫠嫡嫣嫥嫦嫩嫮嫰嫵嫺嫻嬀嬈嬉嬋嬌嬖嬗嬙嬢嬥嬪嬬嬭嬰嬲嬴嬶嬾孀孁孃孅孌子孑孒孔孕孖字存孚孛孜孝孟季孤孥学孨孩孫孯孰孱孳孵學孺孼孽孿宀宁它宄宅宇守安宋完宍宏宓宕宖宗官宙定宛宜宝実客宣室宥宦宬宮宰害宴宵家宸容宿寀寂寃寄寅密寇寉富寎寐寒寓寔寖寘寛寝寞察寡寢寤寥實寧寨審寫寬寮寰寱寳寵寶寸寺寽対寿封専尃射尅将將專尉尊尋對導小少尒尓尖尚尞尠尢尣尤尨尩尫尭尰就尸尹尺尻尼尽尾尿局屁居屆屈届屋屍屎屏屐屑屓展屛属屟屠屡屢屣層履屧屨屩屬屮屯屰山屶屹屺屼岈岊岌岏岐岑岔岟岠岡岢岣岦岧岨岩岪岫岬岭岱岳岵岶岷岸岺岻岼岾峅峇峉峋峐峒峙峠峡峨峩峪峭峯峰峴島峺峻峽崆崇崋崍崎崐崑崔崕崖崗崘崙崚崛崝崟崠崢崤崦崧崩崫崱崹嵂嵆嵇嵊嵋嵌嵎嵐嵒嵓嵜嵡嵩嵪嵬嵭嵯嵰嵳嵶嶁嶂嶄嶇嶈嶋嶌嶐嶒嶔嶗嶙嶝嶠嶢嶤嶧嶬嶮嶰嶲嶴嶷嶸嶹嶺嶼嶽巉巋巌巍巑巒巓巖巗巘巛川州巠巡巢巣巤工左巧巨巩巫差己已巳巴巵巷巻巽巾帀市布帆帋希帑帒帔帕帖帘帙帚帛帝帟帥師席帮帯帰帳帶帷常帽帾幀幃幄幅幇幉幌幎幔幕幖幗幘幞幟幡幢幣幤幫幬幭幮干平年幵并幷幸幹幺幻幼幽幾广庁広庄庇床序底庖店庚府庠庥度座庪庫庬庭庵庶康庸庹庾庿廁廂廃廆廈廉廊廋廏廐廒廓廖廙廚廛廝廟廠廡廢廣廨廩廬廰廱廳廴延廷廸廹建廻廼廽廾廿开弁异弃弄弇弈弉弊弋弌弍弎式弐弑弓弔引弖弗弘弛弜弝弞弟弣弥弦弧弩弭弯弱弴張弶強弸弼弽弾彀彁彅彇彈彊彌彎彑当彔彖彗彘彙彜彝彡形彣彤彦彧彩彪彫彬彭彰影彲彳彷役彼彽彾彿往征徂徃径待徇很徉徊律後徏徐徑徒従得徘徙徜從徠御徢徤徧徨復循徭微徯徳徴徵德徸徹徼徽心忄必忇忉忋忌忍忒忓忔忖志忘忙応忝忞忠忡忢忤忩快忮忯忰忱忳念忸忻忼忽忿怍怎怏怐怒怔怕怖怗怘怙怛怜思怠怡怢怤急怦性怨怩怪怫怯怱怳怵怺恁恂恃恆恇恊恋恌恍恐恒恕恙恚恟恠恢恣恤恥恨恩恪恫恬恭息恰恵恷恿悁悃悄悉悊悋悌悍悒悔悕悖悗悚悛悝悞悟悠患悦悧您悩悪悰悱悲悳悴悵悶悸悼悽悾情惆惇惈惋惑惓惔惕惘惙惚惛惜惝惟惠惡惣惧惨惮惰惱惲想惴惵惶惷惸惹惺惻愀愁愃愆愈愉愍愎意愐愒愓愕愙愚愛愜愞感愡愧愨愫愬愰愴愷愺愼愽愾愿慁慂慄慆慇慈慊態慌慍慎慓慕慘慙慚慝慟慠慢慣慥慧慨慫慮慯慰慱慳慴慵慶慷慼慾憂憇憊憍憎憐憑憒憓憔憖憗憘憙憚憤憥憧憨憩憫憬憭憮憲憶憹憺憼憾懃懆懇懈應懊懋懌懍懐懕懝懟懣懦懲懴懵懶懷懸懺懼懽懾懿戀戈戉戊戌戍戎成我戒戔戕或戚戛戝戞戟戡戢戣戦戩截戮戯戰戲戳戴戸戻戾房所扁扃扆扇扈扉手扌才扎扑扒打払扖托扚扛扞扠扡扣扤扨扭扮扯扱扳扶批扻扼找承技抂抃抄抅抉把抑抒抓抔投抖抗折抙抛抜択抦披抬抱抵抹抻押抽拂拄担拆拇拈拉拊拌拍拏拐拑拒拓拔拕拖拗拘拙招拜拝拠拡括拭拮拯拱拳拵拶拷拼拽拾拿持挂挃指挈按挊挌挍挐挑挘挙挟挧挨挫振挲挵挹挺挻挼挽挾挿捁捃捄捉捌捍捎捏捐捕捗捙捜捥捧捨捩捫捬据捲捶捷捺捻捼掀掃掄授掉掌掎掏排掔掖掘掙掛掟掠採探掣接控推掩措掫掬掲掴掵掻掽掾揀揃揄揆揉描提插揔揕揖揚換揜揠握揣揥揩揫揬揭揮揲援揵揶揷揺搆搉損搏搐搓搔搖搗搜搞搢搥搦搨搩搬搭搯搴搶携搾摂摎摑摘摚摛摝摠摧摩摭摯摳摶摸摹摺摽撃撇撈撑撒撓撕撚撝撞撟撤撥撩撫播撮撰撲撹撻撼撾撿擁擂擄擅擇擊擋擌操擎擐擒擔擕擗擘據擠擡擢擣擤擥擦擧擬擯擱擲擴擶擷擺擻擽擾擿攀攄攅攏攔攖攘攜攝攞攢攣攤攩攪攫攬支攲攴攵收攷攸改攻放政敄故效敍敏救敔敕敖敗敘教敝敞敢散敦敧敫敬数敲整敵敷數敺斁斂斃斄斅文斈斉斊斌斎斐斑斗料斛斜斝斟斡斤斥斧斫斬断斯新斲斵斷斸方於施斿旁旂旃旄旅旆旉旋旌族旒旔旗旙旛无旡既日旦旧旨早旬旭旱旲旹旺旻旼昀昂昃昄昆昇昈昉昊昌明昏易昔昕昜昞星映昡昢昤春昧昨昪昫昭是昰昱昳昴昵昶昺昼昿晁時晃晄晅晈晉晋晌晎晏晑晒晗晙晚晛晝晞晟晡晢晣晤晥晦晧晨晩晪晫晬晭普景晰晳晴晶晷晸智晻暀暁暃暄暇暈暉暍暎暐暑暒暖暗暘暙暝暠暢暦暫暭暮暱暲暴暵暸暹暻暼暾暿曁曄曆曇曈曉曖曙曚曛曜曝曠曦曨曩曬曰曲曳更曵曷書曹曺曻曼曽曾替最朁會朅月有朋服朏朒朓朔朕朖朗朙望朝朞期朦朧木未末本札朮朱朳朴朶朷朸机朽朿杁杆杇杈杉杌杍李杏材村杓杔杖杙杜杝杞束杠条杢杣杤来杦杪杭杯杰東杲杳杴杵杶杷杻杼松板极枅枇枉枋枌析枒枓枕林枘枚枛果枝枠枡枢枦枩枯枰枲枳枴架枷枸枹枻柀柁柃柄柆柈柊柎柏某柑柒染柔柗柘柙柚柛柝柞柢柤柧柩柬柮柯柰柱柳柴柵柷柹査柼柾柿栁栂栃栄栐栓栖栗栘栝栞栟校栢栩株栫栬栭栱栲栳栴核根栻格栽栾桀桁桂桃桄桅框案桉桌桍桎桐桑桒桓桔桕桗桙桛桜桝桟档桧桫桮桲桴桵桶桷桺桼桾桿梁梂梃梅梍梏梐梓梔梖梗梘梙梚梛梜條梟梠梢梣梥梦梧梨梪梫梭梯械梱梲梳梴梵梶梹梺梻梼棃棄棅棆棈棉棊棋棌棍棏棐棒棔棕棖棗棘棙棚棟棠棡棣棤棥棧棨棬棭森棯棰棱棲棷棹棺棻棼椀椁椃椄椅椇椈椊椋椌植椎椏椒椙椚椛検椡椢椣椥椦椨椪椰椴椵椶椹椻椽椿楂楆楉楊楓楔楕楗楙楚楜楝楞楠楡楢楣楤楨楩楪楫楬業楮楯楲楳楴極楷楸楹楺楼楽楾楿榀榁概榊榎榑榒榔榕榖榘榛榜榠榥榦榧榭榮榰榱榲榴榷榺榻榼榾榿槀槁槃槇槊構槌槍槎槏槐槑槓槖様槙槝槞槢槣槧槨槩槪槫槭槮槯槲槳槴槵槶槹槻槽槾槿樂樅樊樋樌樏樑樒樓樔樕樗標樚樛樝樞樟模樢樣権横樫樮樰樲樳樴樵樶樸樹樺樻樽樾樿橄橅橆橇橈橉橋橎橐橒橖橘橙橛機橡橢橤橦橫橲橳橸橺橾橿檀檃檄檉檋檍檎檐檑檔檗檜檝檞檟檠檡檢檣檥檪檫檬檮檳檸檻檽櫁櫂櫃櫆櫐櫑櫓櫔櫚櫛櫜櫝櫞櫟櫤櫧櫨櫪櫬櫱櫲櫳櫺櫻櫽欄欅權欋欏欐欑欒欖欗欛欝欞欟欠次欣欧欬欯欲欵欷欸欹欺欽款歃歆歇歉歊歌歎歐歓歔歖歘歙歛歟歠歡止正此步武歧歩歪歬歯歳歴歵歷歸歹歺死歿殀殁殂殃殄殆殉殊残殍殕殖殘殛殞殤殩殪殫殭殮殯殱殲殳殴段殷殺殻殼殽殾殿毀毅毆毇毈毉毋母毎每毒毓比毖毗毘毚毛毟毦毧毫毬毮毯毱毳毿氂氅氈氊氎氏氐民氓气気氛氣氤氳水氵氶氷永氺氾氿汀汁求汍汎汐汕汗汙汚汛汜汝汞江池汢汧汨汪汭汰汲汳汴汶決汽汾沁沂沃沄沅沆沈沉沌沍沐沒沓沔沕沖沗沘沙沚沛沜没沢沪沫沭沮沱河沸油沺治沼沽沾沿況泂泄泅泆泉泊泌泐泓泔法泖泗泙泚泛泜泝泠泡波泣泥注泩泪泫泬泭泮泯泰泱泳泻洀洄洊洋洌洎洒洗洙洛洞洟洤津洦洧洩洪洫洮洯洱洲洳洴洵洶洸洹活洼洽派洿流浄浅浘浙浚浛浜浞浠浣浤浥浦浩浪浬浮浰浴海浸浹涀涁涂涅涇消涉涊涌涍涎涑涓涔涕涘涙涛涜涪涫涬涮涯液涴涵涸涼涿淀淂淄淅淆淇淈淋淌淎淏淐淑淒淕淖淘淙淚淛淝淞淟淡淤淦淨淩淪淫淬淮深淳淵淶混淹淺添淼清渇済渉渊渋渓渕渗渙渚減渝渞渟渠渡渢渣渤渥渦渧温渫測渭渮港渲渴渶游渺渼渾湃湄湈湉湊湋湌湍湎湏湑湓湔湖湗湘湛湜湞湟湣湧湫湮湯湲湶湾湿満溂溌溏源溓準溘溜溝溟溢溥溧溪溫溯溱溲溴溶溷溺溽溿滁滂滃滄滅滇滉滊滋滌滎滑滓滔滕滙滝滞滫滬滯滲滴滷滸滹滻滾滿漁漂漆漉漊漌漏漐漑漓演漕漘漚漠漢漣漥漪漫漬漯漱漲漳漵漶漸漼漾漿潁潅潑潒潔潗潘潙潚潛潜潞潟潠潡潢潤潦潨潭潮潯潰潴潸潺潼潽潾澀澁澂澄澆澈澌澍澎澐澑澔澖澗澘澟澠澡澣澤澥澧澪澯澱澳澵澶澹澼澾激濁濂濃濆濇濈濉濊濔濕濘濚濛濞濟濠濡濤濩濫濬濮濯濰濱濳濵濶濹濺濼濾瀀瀁瀅瀆瀇瀉瀊瀋瀏瀑瀕瀘瀚瀛瀝瀞瀟瀣瀦瀧瀨瀬瀰瀲瀹瀺瀼瀾灃灇灊灋灌灎灑灔灘灝灞灣灤灥灩火灬灮灯灰灵灶灸灼災灾炁炅炆炉炊炎炒炕炗炙炟炤炫炬炭炮炯炱炳炷炸点為炻烈烊烋烏烑烓烔烘烙烜烝烟烤烬烱烹烽焃焄焆焇焈焉焌焏焔焙焚焜焞焠無焦焫焮焯焰焱然焼煆煇煉煊煌煎煐煑煒煓煕煖煙煜煞煠煢煤煥煦照煨煩煬煮煽熀熄熅熇熈熊熏熒熔熕熖熙熛熟熠熢熨熬熮熯熱熳熹熺熾燁燃燄燈燉燋燎燐燒燓燔燕燗燙燜營燠燥燦燧燬燭燮燵燹燻燼燾燿爀爆爇爍爐爕爛爨爪爫爬爭爰爲爴爵父爸爹爺爻爼爽爾爿牀牂牆片版牋牌牒牓牕牖牗牘牙牛牝牟牡牢牣牧物牮牯牲牴牸特牽牾牿犀犁犂犇犍犎犒犖犛犠犢犧犬犭犮犯犰犱犲状犹犾狀狁狂狃狄狆狌狎狐狒狗狙狛狠狡狢狩独狭狳狷狸狹狺狻狼狽猇猊猒猖猗猘猙猛猜猝猟猥猧猨猩猪猫猬献猯猱猳猴猶猷猹猽猾猿獄獅獎獏獐獒獗獣獦獨獪獫獬獮獯獰獱獲獵獷獸獺獻獼玁玄玅率玉玊王玔玕玖玘玜玞玟玠玢玥玦玨玩玫玲玳玵玷玹玻玼玿珀珂珅珈珉珊珋珍珎珏珖珙珞珠珡珣珥珧珩珪班珮珱珸珹珺現琁球琅理琇琉琊琓琚琛琢琤琥琦琨琪琫琬琮琯琰琱琲琳琴琵琶琹琺琿瑀瑁瑃瑄瑆瑇瑋瑍瑒瑓瑕瑗瑙瑚瑛瑜瑝瑞瑟瑠瑢瑣瑤瑩瑪瑫瑭瑯瑰瑱瑳瑶瑾璁璃璅璆璇璈璉璋璐璒璗璘璙璜璞璟璠璡璢璣璥璦璧璨璩璪璫環璵璹璺璻璽璿瓈瓉瓊瓏瓔瓖瓘瓚瓜瓞瓠瓢瓣瓦瓧瓩瓫瓮瓯瓰瓱瓲瓶瓷瓸瓺瓿甁甃甄甅甌甍甎甑甓甕甗甘甚甜甞生甠産甤甥甦用甪甫甬甯田由甲申男甸町画甼甽甾畀畄畆畈畉畊畋界畍畎畏畐畑畒畔留畚畛畜畝畠畢畤略畦畧畩番畫畬畭畯異畱畲畳畴當畷畸畹畺畽畾畿疁疂疆疇疉疊疋疌疎疏疑疒疔疚疝疢疣疥疫疰疱疲疳疵疷疸疹疼疽疾疿痀痂痃病痆症痊痍痎痏痒痓痔痕痘痙痛痝痞痟痠痢痣痤痧痩痬痮痰痱痲痳痴痹痺痼痾痿瘀瘁瘂瘃瘇瘈瘉瘋瘍瘏瘓瘕瘖瘘瘙瘛瘜瘞瘟瘠瘡瘢瘤瘥瘦瘧瘨瘭瘰瘳瘴瘵瘻瘼癁療癃癆癇癈癉癋癌癒癕癖癘癜癡癢癤癥癧癨癩癪癬癭癮癯癰癱癲癶癸発登發白百皀皁皃的皆皇皈皋皎皐皓皕皖皙皚皛皜皝皞皠皡皦皧皨皪皮皯皰皴皶皷皸皹皺皿盂盃盅盆盈盉益盌盍盎盒盔盖盗盛盜盞盟盡監盤盥盦盧盨盪盬目盱盲直相盻盼盾省眄眇眈眉眊看県眗眙眚眛眞真眠眤眥眦眩眭眴眵眶眷眸眺眼着睆睇睍睎睘睚睛睜睟睠睡睢督睥睦睨睪睫睲睹睺睼睽睾睿瞀瞋瞎瞑瞔瞚瞞瞟瞠瞢瞤瞥瞩瞪瞬瞭瞰瞳瞶瞹瞻瞼瞽瞿矇矍矗矚矛矜矞矟矠矢矣矤知矦矧矩矪矬短矮矯矰石矴矻矼砂砅砆砉砌砍砒研砕砙砠砡砥砦砧砬砭砲破砺砿硃硅硇硎硏硑硝硤硨硪硫硬确硯硲硴硼碁碆碇碊碌碍碎碑碓碔碕碗碚碝碞碟碣碤碧碩碪碭碯碰碵確碻碼碾磁磅磆磈磊磋磌磎磐磑磔磕磚磠磡磤磦磧磨磬磯磲磴磷磹磺磻磽磾礀礁礇礎礐礑礒礙礛礜礥礦礪礫礬礮礰礱礴示礻礼社祀祁祅祆祇祈祉祊祐祓祕祖祗祘祚祛祜祝神祟祠祢祥祧票祭祲祷祹祺祿禀禁禄禅禊禍禎福禔禕禖禘禛禝禡禦禧禩禪禮禰禱禳禴禸禹禺离禽禾禿秀私秂秇秈秉秊秋秌种科秒秔秕秖秘秞租秡秣秤秦秧秩秫秬秭称移稀稃稈稊程稍税稑稔稕稗稘稙稚稛稜稞稟稠稭種稱稲稷稸稹稻稼稽稾稿穀穂穃穆穇穉穌積穎穏穐穖穗穙穜穝穟穠穡穢穣穧穩穪穫穭穰穴穵究穸穹空穽穿突窂窃窄窅窈窊窐窒窓窕窖窗窘窟窠窣窩窪窬窮窯窰窳窶窹窺窻窼窾窿竃竄竅竇竈竊立竌竍竎竏竑竒竓竕站竚竜竝竟章竡竢竣童竦竧竨竪竫竭端竰竴競竸竹竺竽竿笂笄笆笇笈笊笋笏笑笒笘笙笛笞笠笥符笧笨笪第笭笮笯笱笳笵笶笹笻笽筁筅筆筇筈等筋筌筍筎筏筐筑筒答筕策筝筠筤筥筦筧筩筬筭筮筯筰筱筲筳筴筵筹筺筿箆箇箋箍箏箐箑箒箔箕算箘箙箚箛箜箝箞箟管箪箭箯箱箴箵箸箼節篁範篅篆篇築篊篋篌篏篔篖篗篙篚篝篠篤篥篦篩篪篭篰篳篶篷簀簁簃簇簋簍簎簏簑簒簓簔簗簞簟簠簡簣簦簧簪簫簱簳簶簷簸簽簾簿籀籃籅籊籌籍籏籐籑籔籖籗籘籙籞籟籠籡籤籥籩籬籭籮籯籰米籵籹籾粁粂粃粉粋粍粏粐粒粔粕粗粘粛粟粠粡粢粤粥粦粧粨粫粭粮粱粲粳粶粷粹粼粽精粿糀糂糄糅糈糊糍糎糒糕糖糗糘糙糜糝糞糟糠糢糦糧糫糯糲糴糵糶糸糺系糾紀紂紃約紅紆紇紈紉紊紋納紐紒紓純紕紗紘紙級紛紜紝紞素紡索紣紫紬紮累細紱紲紳紵紹紺紽紾紿絀絁終絃組絅絆絇絈絋経絎絏結絓絖絙絚絛絜絞絡絢絣給絨絪絮絰統絲絳絵絶絹絺絽絿綃綆綈綉綋綌綏經綗継続綛綜綝綟綠綢綣綦綧綪綫綬維綮綯綰綱網綴綵綶綷綸綺綻綽綾綿緀緂緇緊緋緌総緑緒緕緖緗緘緙線緜緝緞締緡緣緤緦編緩緬緯緱緲練緹緻縁縄縅縈縉縊縋縐縑縒縕縗縛縝縞縟縠縡縢縣縦縧縨縫縬縮縱縲縵縷縹縺縻總績繁繃繅繆繇繊繋繍繒織繕繖繙繚繝繞繡繦繧繩繪繫繭繰繳繵繹繻繼繽繾繿纂纃纆纇纈纉纊續纍纎纏纐纑纒纓纔纖纘纚纛纜缶缸缺缻缼缾罃罄罅罇罌罍罎罏罐网罒罔罕罘罟罠罡罣罤罧罨罩罪罫罭置罰署罵罷罸罹罽罾羂羃羅羆羇羈羊羌美羐羑羔羖羗羚羜羝羞羣群羨義羭羮羯羲羶羸羹羽羿翁翃翅翆翊翌翎翏習翔翕翛翟翠翡翣翥翦翩翫翬翮翯翰翲翳翹翺翻翼耀老耂考耄者耆耈耊耋而耎耐耑耒耔耕耖耗耘耙耜耡耤耦耨耬耰耳耵耶耷耻耼耽耿聃聆聊聒聖聘聚聞聟聡聢聦聨聯聰聱聲聳聴聵聶職聹聻聽聾聿肄肅肆肇肉肋肌肓肖肘肙肚肛肜肝股肢肤肥肧肩肪肬肭肯肱育肴肸肺胃胄胅胆胊背胎胕胖胗胘胙胚胛胝胞胠胡胤胥胦胯胱胳胴胵胸胻胼能脂脅脆脇脈脉脊脍脖脘脚脛脞脣脤脧脩脬脯脱脳脵脹脽脾腆腊腋腎腐腑腓腔腕腟腠腥腦腧腨腩腫腭腮腰腱腴腸腹腺腿膀膁膂膃膄膅膈膊膏膓膕膘膚膜膝膠膣膤膨膩膰膲膳膵膸膺膻膽膾膿臀臁臂臃臆臈臉臊臍臏臑臓臖臗臘臙臚臛臟臠臣臤臥臧臨自臬臭至致臺臻臼臽臾臿舁舂舄舅與興舉舊舌舍舎舐舒舖舗舘舙舛舜舞舟舡舢舩航舫般舮舲舳舴舵舶舷舸船舼艀艅艆艇艉艋艏艗艘艙艚艜艝艟艠艢艣艤艦艨艪艫艮良艱色艴艶艷艸艹艽艾艿芃芊芋芍芎芒芓芙芝芟芡芣芤芥芦芧芨芩芫芬芭芮芯花芲芳芴芷芸芹芺芻芼芽芾芿苅苆苑苒苓苔苕苗苙苛苜苞苟苡苢苣若苦苧苨苫英苳苴苷苹苺苻苽苾茀茁茂范茄茅茆茇茈茉茌茎茖茗茘茛茜茝茢茣茨茫茭茯茰茱茲茴茵茶茸茹茺茼荀荃荄荅荇草荊荏荐荑荒荔荕荗荘荢荣荳荵荷荻荼荽荿莅莆莇莉莊莍莎莒莓莔莕莖莘莚莛莝莞莟莠莢莧莨莩莪莫莱莵莽莿菀菁菅菇菉菊菌菎菏菐菑菓菔菖菘菜菝菟菠菡菥菩菪菫華菰菱菲菴菷菹菻菽萁萃萄萆萇萊萋萌萍萎萏萑萓萕萗萠萢萩萪萬萱萵萸萹萼落葆葈葉葊葎葏葑葒著葙葚葛葜葟葡葢董葥葦葩葫葬葭葮葯葰葱葳葵葶葷葸葹葺葼蒁蒂蒄蒅蒋蒐蒔蒗蒙蒜蒞蒟蒡蒦蒭蒯蒲蒴蒸蒹蒺蒻蒼蒾蒿蓀蓁蓂蓄蓆蓉蓊蓋蓍蓎蓏蓐蓑蓓蓖蓙蓚蓜蓧蓪蓬蓮蓯蓰蓱蓴蓺蓼蓽蓿蔀蔆蔌蔑蔓蔔蔕蔗蔘蔚蔛蔞蔟蔡蔣蔤蔥蔦蔫蔬蔭蔯蔲蔴蔵蔽蔾蕀蕁蕃蕈蕉蕊蕋蕎蕏蕑蕓蕕蕗蕘蕙蕚蕞蕡蕢蕣蕤蕨蕩蕪蕭蕯蕷蕺蕻蕽蕾蕿薀薁薄薆薇薈薊薌薏薐薑薓薔薗薙薛薜薝薟薢薤薦薨薩薪薫薬薭薮薯薰薷薹薺薼藁藇藉藊藋藍藎藏藐藕藘藙藜藝藟藡藤藥藦藩藪藭藶藷藹藺藻藾藿蘀蘂蘄蘅蘆蘇蘊蘋蘐蘑蘒蘓蘖蘗蘘蘚蘞蘡蘢蘤蘧蘩蘭蘯蘰蘸蘹蘼蘿虀虁虍虎虐虓虔處虖虗虚虛虜虞號虢虧虫虬虯虱虵虷虹虺虻蚇蚉蚊蚋蚌蚍蚑蚓蚕蚘蚜蚝蚣蚤蚨蚩蚪蚫蚯蚰蚱蚳蚶蚸蛁蛃蛄蛆蛇蛉蛋蛍蛎蛑蛔蛕蛗蛙蛛蛞蛟蛣蛤蛦蛩蛬蛭蛮蛯蛸蛹蛺蛻蛼蛽蛾蜀蜂蜃蜅蜆蜇蜈蜉蜊蜋蜍蜎蜐蜑蜒蜓蜘蜙蜚蜜蜟蜡蜣蜥蜩蜱蜴蜷蜺蜻蜾蜿蝀蝃蝉蝋蝌蝎蝑蝓蝕蝗蝘蝙蝟蝠蝣蝤蝥蝦蝨蝪蝮蝱蝲蝴蝶蝸蝼蝿螂螇螈螉螋融螓螟螠螢螧螫螬螭螯螳螵螺螻螽螾蟀蟁蟄蟆蟇蟋蟎蟐蟒蟖蟟蟠蟣蟥蟦蟪蟫蟬蟭蟯蟲蟵蟶蟷蟹蟻蟾蠁蠃蠅蠆蠊蠋蠍蠎蠏蠐蠑蠓蠔蠕蠖蠟蠡蠢蠣蠧蠨蠮蠱蠲蠶蠹蠻蠼血衂衄衆衊行衍衒術街衘衙衛衝衞衟衡衢衣衤表衩衫衯衰衲衵衷衽衾衿袁袂袈袋袍袒袖袗袘袙袞袠袢袤袪被袮袰袱袴袵袷袼袽袾袿裀裁裂裃裄装裊裎裏裑裒裓裔裕裘裙裛補裝裟裡裨裰裱裲裳裴裵裸裹裼製裾褁褂褄複褊褌褐褒褓褘褙褚褜褝褞褥褧褪褫褰褲褶褷褸褹褻襀襁襂襃襄襅襉襌襍襖襞襟襠襢襤襦襪襭襯襲襴襷襾西覀要覃覆覇覈覉覊見規覐覓覔視覗覘覚覟覡覦覧覩親覬覯覰覲観覷覺覽覿觀角觔觖觘觚觜觝解觥触觧觫觱觳觴觶觸觽觿言訂訃計訊訌討訐訑訒訓訔訕訖託記訛訝訟訡訢訣訥訪設許訳訴訵訶訷診註証訾詁詅詆詇詈詍詎詐詑詒詔評詘詛詝詞詠詡詢詣試詩詫詬詭詮詰話該詳詵詹詼誂誄誅誇誉誌認誐誑誓誕誘誚語誠誡誣誤誥誦誧誨説読誮誰課誷誹誼誾調諂諄談請諌諍諏諐諒論諗諚諛諜諞諟諠諡諢諤諦諧諫諭諮諱諳諴諶諷諸諺諼諾謀謁謂謄謅謇謊謌謍謎謐謔謖謗謙謚講謜謝謟謠謡謦謨謫謬謭謳謹謾譁譃譆證譌譎譏譑譔譖識譙譚譛譜譞譟警譩譫譬譯議譱譲譴譶護譽譿讀讁讃變讋讌讎讐讒讓讔讕讖讙讚讜讝讞谷谹谺谽谿豁豅豆豇豈豉豊豌豎豏豐豔豕豗豚象豢豨豩豪豫豬豭豳豸豹豺豼貂貅貉貊貌貍貎貒貓貔貘貙貛貝貞負財貢貤貧貨販貪貫責貭貮貯貰貲貳貴貶買貸費貼貽貿賀賁賂賃賄資賈賊賍賎賑賓賕賖賙賚賛賜賞賠賡賢賣賤賦質賭賰賱賴賸賺賻購賽賾贄贅贇贈贉贊贋贍贎贏贐贒贓贔贖贛赤赦赧赫赬赭走赱赳赴起趁趄超越趕趙趣趦趨趯足趺趾跂跆跈跋跌跎跏跑跖跗跙跚跛距跟跡跣跨跪跫跬路跳践跼跽跿踆踈踉踊踌踏踐踔踖踝踞踟踠踡踢踣踧踪踰踴踵踶踹踽蹂蹄蹇蹈蹉蹊蹋蹌蹐蹔蹕蹙蹟蹠蹢蹣蹤蹬蹭蹯蹰蹲蹴蹶蹻蹼躁躄躅躇躊躋躍躑躓躔躘躙躞躡躪身躬躮躯躰躱躳躵躶躻躾軀軅軆軈車軋軌軍軑軒軔軛軟転軣軫軸軹軺軻軼軽軾輀較輅輈載輊輌輒輓輔輕輗輙輛輜輝輞輟輦輩輪輫輭輯輳輶輸輹輻輾輿轀轂轄轅轆轉轊轌轍轎轔轗轘轜轟轡轢轣轤辛辜辞辟辣辤辦辧辨辭辮辯辰辱農辴辵辶辷辺辻込辿迁迂迄迅迆迊迍迎近迓返迕迚迠迢迤迥迦迨迩迪迫迭迮迯述迱迴迵迷迸迹迺迻追退送适逃逅逆逈逋逌逍逎透逐逑逓途逕逖逗這通逝逞速造逡逢連逧逭逮週進逵逶逷逸逹逼逾遁遂遃遄遅遇遉遊運遍過遏遐遑遒道達違遖遘遙遜遝遞遠遡遣遥遨適遭遮遯遲遵遶遷選遺遼遽避邀邁邂邃還邅邇邈邉邊邌邏邐邑邕邗邙邛邡邢那邦邨邪邯邰邱邳邵邶邸邾郁郃郄郅郇郈郊郎郗郛郜郝郞郟郡郢郤部郫郭郯郲郴郵郶郷都郾郿鄀鄂鄄鄆鄒鄔鄕鄖鄘鄙鄜鄞鄢鄣鄧鄭鄯鄰鄱鄲鄴鄷鄹鄺鄽酆酇酈酉酊酋酌配酎酒酔酖酗酘酙酛酡酢酣酤酥酩酪酬酲酳酴酵酷酸酹醂醃醅醇醉醋醍醎醐醒醗醜醞醢醤醨醪醫醬醮醯醱醳醴醵醶醸醺醼釀釁釃釄釆采釈釉釋里重野量釐金釖釗釘釚釛釜針釟釡釣釤釥釦釧釬釭釮釱釵釶釻釼釿鈁鈇鈊鈍鈎鈐鈑鈔鈕鈖鈗鈞鈩鈬鈳鈴鈷鈸鈹鈺鈼鈿鉀鉂鉃鉄鉅鉇鉈鉉鉊鉋鉎鉏鉐鉑鉖鉗鉙鉚鉛鉞鉠鉡鉢鉤鉥鉦鉧鉨鉱鉸鉼鉽鉾鉿銀銃銅銈銉銍銑銓銕銖銗銘銙銚銛銜銟銧銫銭銲銷銹銿鋀鋂鋆鋋鋌鋎鋏鋐鋒鋓鋗鋙鋠鋤鋥鋧鋩鋪鋭鋲鋳鋷鋸鋹鋺鋻鋼鋿錂錄錆錍錏錐錑錕錘錙錚錝錞錟錠錡錢錣錥錦錧錨錩錫錬錮錯録錵錺錻鍄鍇鍈鍉鍊鍋鍍鍑鍔鍖鍗鍚鍛鍜鍠鍤鍥鍪鍫鍬鍮鍰鍱鍳鍵鍼鍾鎈鎋鎌鎏鎔鎖鎗鎚鎛鎞鎡鎣鎧鎬鎭鎮鎰鎹鎺鏁鏃鏆鏇鏈鏐鏑鏖鏗鏘鏜鏝鏞鏟鏡鏢鏤鏥鏧鏨鏱鏵鏻鏽鐃鐄鐇鐉鐏鐐鐓鐔鐖鐗鐘鐙鐚鐡鐫鐲鐳鐴鐵鐶鐸鐺鐻鑁鑄鑅鑊鑑鑒鑓鑚鑛鑞鑠鑢鑣鑪鑫鑭鑯鑰鑱鑲鑵鑷鑼鑽鑾鑿钁長镸镹門閂閃閆閇閉閊開閌閍閎閏閑間閔閖閘閙閟閠関閣閤閥閦閧閨閩閫閬閭閲閴閶閹閻閼閽閾闃闇闈闊闋闌闍闐闓闔闕闖闘闚關闞闡闢闥阜阝阡阨阪阬阮阯防阳阴阻阼阿陀陁陂附陋陌降陏限陘陛陜陝陞陟陡院陣除陥陦陪陬陰陲陳陵陶陷陸険陽隂隄隅隆隈隊隋隍階随隔隕隗隘隙隚際障隝隠隣隤隥隧隨隩險隯隰隱隲隳隴隶隷隸隹隺隻隼隽雀雁雄雅集雇雉雋雌雍雎雑雒雕雖雘雙雚雛雜雝雞離難雨雩雪雫雯雰雲零雷雹電需霄霆震霈霊霍霎霏霑霓霔霖霙霜霞霣霤霧霪霰露霳霶霸霹霻霽霾靁靂靄靆靇靈靉靍靎靏青靕靖靗静靚靛靜非靠靡面靤靦靨革靪靫靭靮靱靳靴靹靺靼鞁鞄鞅鞆鞋鞍鞏鞐鞕鞖鞘鞚鞜鞞鞠鞢鞣鞦鞨鞫鞭鞮鞱鞲鞳鞴鞺鞾韁韃韆韈韉韋韌韑韓韔韘韙韛韜韞韡韭韮韱韲音韴韵韶韻響頁頂頃頄項順須頊頌頍頎頏預頑頒頓頔頖頗領頚頞頡頣頤頥頫頬頭頰頲頳頴頷頸頻頼頽顆顇顋題額顎顏顒顓顔顕顖顗願顙顚顛類顥顦顧顫顬顯顰顱顳顴風颪颫颭颯颰颱颶颷颸颺颻颼颿飂飃飄飆飇飈飋飛飜食飠飡飢飣飥飧飩飪飫飭飮飯飰飱飲飳飴飼飽飾餃餅餈餉養餌餐餒餓餔餖餗餘餚餛餜餝餞餠餡餤館餬餮餱餲餳餺餻餼餽餾饀饁饂饅饆饉饋饌饍饎饐饑饒饕饗饘饜饟饠首馗馘香馞馣馥馦馨馬馭馮馳馴馹馼馽馿駁駃駄駅駆駈駉駐駑駒駔駕駘駙駛駝駞駟駢駭駮駰駱駲駸駹駻駼駿騁騂騃騅騊騎騏騑騒験騖騙騚騠騤騨騫騭騮騰騱騶騷騸騾驀驂驃驄驅驊驌驍驎驒驕驗驘驚驛驟驢驤驥驩驪驫骨骭骯骰骶骷骸骹骼髀髁髃髄髆髎髏髐髑髒髓體髕髖高髜髞髟髠髢髣髥髦髩髪髫髭髮髯髱髴髷髹髻鬂鬃鬆鬈鬌鬐鬒鬖鬘鬚鬜鬟鬠鬢鬣鬥鬧鬨鬩鬪鬫鬭鬮鬯鬱鬲鬳鬻鬼鬽魁魂魃魄魅魋魍魎魏魑魔魘魚魞魣魥魦魫魬魯魲魳魴魵魶魷魹鮃鮄鮊鮎鮏鮑鮒鮓鮖鮗鮞鮟鮠鮦鮧鮨鮪鮫鮬鮭鮮鮱鮲鮴鮸鮹鮾鯀鯁鯆鯇鯉鯊鯎鯏鯑鯒鯔鯖鯘鯛鯝鯡鯢鯣鯤鯥鯧鯨鯪鯫鯮鯯鯰鯱鯲鯳鯵鯷鯸鯺鯽鰀鰄鰆鰈鰉鰊鰌鰍鰐鰒鰓鰔鰕鰖鰘鰙鰚鰛鰝鰡鰢鰣鰤鰥鰧鰩鰪鰭鰮鰯鰰鰱鰲鰶鰷鰹鰺鰻鰾鱁鱅鱆鱇鱈鱉鱊鱏鱐鱒鱓鱔鱗鱘鱚鱛鱜鱝鱟鱠鱣鱥鱧鱩鱪鱫鱭鱮鱰鱲鱵鱶鱷鱸鱺鳥鳦鳧鳩鳫鳬鳰鳲鳳鳴鳶鴂鴃鴆鴇鴈鴉鴋鴎鴑鴒鴕鴗鴘鴛鴝鴞鴟鴣鴦鴨鴪鴫鴬鴲鴻鴾鴿鵁鵂鵃鵄鵆鵇鵈鵊鵐鵑鵒鵙鵜鵝鵞鵟鵠鵡鵢鵣鵤鵩鵫鵬鵯鵰鵲鵳鵶鵷鵺鵼鵾鶄鶇鶉鶊鶍鶏鶖鶙鶚鶡鶤鶩鶫鶬鶯鶲鶴鶵鶸鶹鶺鶻鶼鶽鶿鷀鷁鷂鷃鷄鷆鷇鷉鷏鷓鷖鷗鷙鷚鷟鷠鷣鷦鷧鷭鷯鷲鷴鷸鷹鷺鷽鸂鸇鸊鸍鸕鸙鸚鸛鸜鸝鸞鹵鹸鹹鹻鹼鹽鹿麀麁麅麈麋麌麑麒麓麕麗麛麝麞麟麤麥麦麨麩麪麬麭麯麴麵麸麹麺麻麼麽麾麿黃黄黌黍黎黏黐黑黒黔默黙黛黜黝點黟黠黥黧黨黮黯黴黶黷黹黻黼黽黿鼂鼃鼇鼈鼎鼐鼓鼕鼗鼙鼠鼡鼬鼯鼷鼹鼺鼻鼽鼾齁齅齆齊齋齎齏齒齓齔齕齗齘齝齟齠齡齢齣齦齧齩齪齬齭齰齲齵齶齷龍龐龔龕龗龜龝龠龢𠀋𠂉𠂢𠂤𠆢𠈓𠌫𠍱𠎁𠏹𠑊𠔉𠗖𠘨𠝏𠠇𠠺𠢹𠥼𠦝𠫓𠬝𠮟𠵅𠷡𠹤𠹭𠺕𠽟𡈁𡈽𡉕𡉴𡉻𡋗𡋤𡋽𡌛𡌶𡍄𡏄𡑭𡑮𡗗𡙇𡚴𡜆𡝂𡢽𡧃𡱖𡴭𡵅𡵢𡵸𡶒𡶜𡶡𡶷𡷠𡸳𡸴𡼞𡽶𡿺𢅻𢈘𢌞𢎭𢛳𢡛𢢫𢦏𢪸𢭆𢭏𢭐𢮦𢰝𢰤𢷡𣆶𣇃𣇄𣇵𣍲𣏐𣏒𣏓𣏕𣏚𣏟𣏤𣑊𣑋𣑑𣑥𣓤𣕚𣖔𣗄𣘸𣘹𣘺𣙇𣜌𣜜𣜿𣝣𣝤𣟧𣟿𣠤𣠽𣪘𣱿𣳾𣴀𣴎𣵀𣷓𣷹𣷺𣽾𤂖𤄃𤇆𤇾𤎼𤘩𤚥𤟱𤢖𤩍𤭖𤭯𤰖𤴔𤸎𤸷𤹪𤺋𥁊𥁕𥄢𥆩𥇍𥇥𥈞𥉌𥐮𥒎𥓙𥔎𥖧𥝱𥞩𥞴𥧄𥧔𥫣𥫤𥫱𥮲𥱋𥱤𥶡𥸮𥹖𥹢𥹥𥻂𥻘𥻨𥼣𥽜𥿔𥿠𥿻𦀌𦀗𦁠𦃭𦉰𦊆𦍌𦐂𦙾𦚰𦜝𦣝𦣪𦥑𦥯𦧝𦨞𦩘𦪌𦪷𦫿𦰩𦱳𦳝𦹀𦹥𦾔𦿶𦿷𦿸𧃴𧄍𧄹𧏚𧏛𧏾𧐐𧑉𧘔𧘕𧘱𧚄𧚓𧜎𧜣𧝒𧦅𧪄𧮳𧮾𧯇𧲸𧶠𧸐𧾷𨂊𨂻𨉷𨊂𨋳𨏍𨐌𨑕𨕫𨗈𨗉𨛗𨛺𨥆𨥉𨥫𨦇𨦈𨦺𨦻𨨞𨨩𨩃𨩱𨪙𨫍𨫝𨫤𨯁𨯯𨴐𨵱𨷻𨸟𨸶𨺉𨻫𨼲𨿸𩊠𩊱𩒐𩗏𩙿𩛰𩜙𩝐𩣆𩩲𩷛𩸕𩸽𩹉𩺊𩻄𩻛𩻩𩿎𪀚𪀯𪂂𪃹𪆐𪎌𪐷𪗱𪘂𪘚𪚲欄廊朗虜殺類隆﨏塚﨑﨓﨔凞猪神祥福﨟蘒﨡諸﨤都侮僧免勉勤卑喝嘆器塀墨層屮悔慨憎懲敏既暑梅海渚漢煮爫琢碑社祉祈祐祖祝禍禎穀突節練縉繁署者臭艹艹著褐視謁謹賓贈辶逸難響頻


オブジェクトのkeyを対象に絞り込み検索を実現する(その1)


絞込検索を実現したくて試したコードです


オブジェクトの中の特定のKEYに含まれる文字列で絞り込み検索をするコードの例です
  1. 検索エリアにキーワードとなる文字列を入力する
  2. オブジェクトのKEYを見て絞り込み検索を行う
    • 入力された文字をすべて含むKEYだけを抽出する
  3. 抽出されたKEYとVALUEを取得して返す

デモ

index.htmlのobj内の en で絞り込む






上部のテキストボックスに ar と入力すると
en の中で ar を含むものだけに絞り込まれる



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<body>
  <input type="text" id="searchbox"><br>
  <textarea id="ta" style="width:240px;height:240px;"></textarea>
  <div id="result"></div>

  <script>
    var obj = [{
        "en": "Aries",
        "ja": "おひつじ座"
      },
      {
        "en": "Taurus",
        "ja": "おうし座"
      },
      {
        "en": "Gemini",
        "ja": "ふたご座"
      },
      {
        "en": "Cancer",
        "ja": "かに座"
      },
      {
        "en": "Leo",
        "ja": "しし座"
      },
      {
        "en": "Virgo",
        "ja": "おとめ座"
      },
      {
        "en": "Libra",
        "ja": "てんびん座"
      },
      {
        "en": "Scorpius",
        "ja": "さそり座"
      },
      {
        "en": "Sagittarius",
        "ja": "いて座"
      },
      {
        "en": "Capriconus",
        "ja": "やぎ座"
      },
      {
        "en": "Aquarius",
        "ja": "みずがめ座"
      },
      {
        "en": "Pisces",
        "ja": "うお座"
      }
    ]

    var searchbox = document.getElementById("searchbox");
    var ta = document.getElementById("ta");
    var pattern;    
    searchbox.onkeyup = searchbox_keyup;

    function searchbox_keyup() {
      var items = searchbox.value.split(" ");
      var str = "";
      for (var i = 0; i < items.length; i++) {
        str += "(?=.*" + items[i] + ")";
      }
      pattern = new RegExp("^" + str);
      var filtered = obj.filter(judge);
      var result = get_result(filtered);
      ta.value = result;
    }

    function judge(items) {
      var regexp = new RegExp(pattern);
      var judged = regexp.test(items["en"]);
      return judged;
    }

    function get_result(filtered) {
      var result = [];
      for (var i = 0; i < filtered.length; i++) {
        result.push([filtered[i]["en"], filtered[i]["ja"]]);
      }
      return result;
    }
  </script>
</body>
</html>
意訳
 


テキストボックス
テキストエリア
div


12星座の英語表記と日本語表記のオブジェクト

















































idがsearchboxの要素を取得する
idがtaの要素を取得する
patternの入れ物を用意する
searchbox内でキーが上がったらsearchbox_keyupを実行する

この機能がやること
searchboxの値を半角スペースで区切って
正規表現のパターンの文字列を入れる入れ物を用意する
半角スペースで区切られた数だけ以下を繰り返す
一致するキーワードを含むものだけに絞り込んでいく

正規表現オブジェクトを作る
obj中身をjudgeで処理した結果を取得して
get_resultに渡してresultを取得して
taに入れる


この機能がやること
patternで正規表現オブジェクトを作って
obj["en"]の要素の中で正規表現に一致すれば
返す


この機能がやること
resultの入れ物を作って
受け取ったfilteredの数だけ繰り返す
enとjaのセットをそれぞれresultに追加する

できあがったresultを返す







シートの列内のデータを重複なく書き出す関数 =UNIQUE(A:A)


スクリプトではありませんが
シートの列内の重複データを見つける
を書いた時に重複しない方法も書き残そうと思って

=UNIQUE(A:A)


重複なく書き出す
以下のようにA列に重複した値が入っているとき
B1に=UNIQUE(A:A)を入れるとA列の値を重複なく一意で表示できます

シートの列内の重複データを見つける関数


シートの列内で重複するデータを見つけるというのを
Google Apps Scriptでやろうと思いましたが
スプレッドシートの関数でできそうな気がしたので調べて試した2つの方法を書き残しておきます
  1. =COUNTIF(A:A,A:A)>1
    • 重複したセルに色をつける(条件書式のカスタム数式)
  2. =IF(COUNTIF(A1:A,A1)>1,"重複","")
    • 2つ目以降の重複したセルのB列に「重複」を入れる


1. =COUNTIF(A:A,A:A)>1


重複したセルに色をつける

条件書式のカスタム数式に関数を入れる方法

条件書式を設定する手順


「表示形式」→「条件書式...」 を選択


「セルの書式設定の条件...」をクリック


「カスタム数式」を選択


「範囲に適用」の欄に適用したい範囲を選択
カスタム数式の欄に =COUNTIF(A:A,A:A)>1 を入力
「完了」をクリック



2. =IF(COUNTIF(A1:A,A1)>1,"重複","")


2つ目以降の重複したセルのB列に「重複」を入れる方法

B1に =IF(COUNTIF(A1:A,A1)>1,"重複","") を入れて適用したい範囲までドラッグする
B2以降は自動でセルを参照してくれる
=IF(COUNTIF(A2:A,A2)>1,"重複","")


これをスクリプトのsetValue()を使ってシートに入力したい場合

コード.gs
function check_duplication(){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  for(var i = 1; i < last_row + 1; i++){
    var range = sh.getRange("B"+ i);
    var formula = range.getFormula();
    if(formula == ""){
  range.setValue('=IF(COUNTIF(indirect("A"&row()&":A"),indirect("A"&row()))>1,"重複","")')
    }else{
      break;
    }
  }
}


関連記事

シートの列内のデータを重複なく書き出す関数 =UNIQUE(A:A)

2018年2月26日月曜日

シートの特定の列で指定した日時よりも新しい日時の行を取得する


スプレッドシートの特定の列で基準日時よりも新しい日時の行を取得したい

  1. 基準日時を決める
  2. 対象の列の値(日時)を取得する
  3. 基準日時よりも大きい日時を抽出する

ということを実現するコードの例です



コード.gs
function get_updated_rows(){
  var latest = new Date("2018/02/26 18:49:50");
  var values = get_values();
  var rows = judge_array(values, latest);
  Logger.log(rows)
}

function get_values(){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var range = sh.getRange("A1:A" + last_row)
  var values = range.getValues();
  return values;
}

function judge_array(values, latest) {
  var rows = [];
  for(var i = 0; i < values.length; i++){
    if(values[i][0] > latest){
      var value = format_date(values[i][0]);
      rows.push(i + 1);
    }
  }
  return rows;
}

function format_date(date){
  return  Utilities.formatDate(new Date(date), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")
}
意訳
この機能がやること
基準日時を決めて
get_values()からvaluesを取得して
judge_array(values, latest)に渡して結果を得て
ログに出す


この機能がやること
スプレッドシートを取得して
データが入っている最終行を取得して
範囲を指定して
値を取得して
返す


この機能がやること
rowsという空の配列を作って
受け取ったvaluesの数だけ以下を繰り返す
ひとつずつ値を取得してもしlatestよりも大きければ
format_date(date)に送ってフォーマットして
i に 1を足してrowsに追加する(i は 0始まりでシートの行は1始まりなので+1する)


出来上がったrowsを返す


この機能がやること
受け取ったdateを指定したtimezoneと形式にフォーマットして返す




シート内の特定の列の最大値と最小値を取得する


関数でやると

最大値は
=max(A:A)

最小値は
=min(A:A)

のようにA列の中での最大値・最小値を出すということを
スクリプトで実現するコードの例です

この例では特定の列にある日付の最大値と最小値を取得します



コード.gs
function get_log(){
  var array = get_array();
  var max = get_max(array);
  var min = get_min(array);
  var max_date = format_date(max);
  var min_date = format_date(min);
  Logger.log([max_date, min_date]);
}

function get_array() {
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var range = sh.getRange("A2:A" + last_row)
  var values = range.getValues();
  var array = [];
  for(var i = 0; i < values.length; i++){
    array.push(values[i][0]);
  }
  return array;
}

function get_max(array) {
  array.sort(sorting);
  var max = array[array.length-1];
  return max;
}

function get_min(array) {
  array.sort(sorting);
  var min = array[0];
  return min;
}

function sorting(a, b){
  return a - b;
}

function format_date(date){
  return  Utilities.formatDate(new Date(date), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")
}
意訳
この機能がやること
get_array()からarrayを取得して
get_max(array)に渡してmaxを取得して
get_min(array)に渡してminを取得して
max_dateをフォーマットして
min_dateをフォーマットして
ログに出す


この機能がやること
すくレッドシートを取得して
データが入っている最終行を取得して
範囲を指定して
値を取得して
arrayという空の配列を作って
値の数だけ以下を繰り返す
array配列に1つずつ値を追加する

出来上がったarrayを返す


この機能がやること
渡されたarrayの要素をsortingで昇順にソートして
配列の末尾(最大値)を取得して
返す


この機能がやること
渡されたarrayの要素をsortingで昇順にソートして
配列の先頭(最小値)を取得して
返す


この機能がやること
配列内の数値の大小を引き算した結果を返す(正の数か負の数かで配列の順番をソートする)


この機能がやること
渡されたdateを指定したタイムゾーンと形式でフォーマットして返す



関連記事

JavaScriptで配列内の最大値・最小値を取得したい


入力エリアで特定のキーが押された時に処理を実行する


確定キー(return/enter)を押した時だけ実行するコードの例です





上記のテキストエリアで確定キーを押すとアラートが表示されます



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <textarea id="ta"></textarea>
    <script>
    document.getElementById("ta").onkeyup = ta_keyup;
 
    function ta_keyup(e) {
      var keycode = e.keyCode;
      if (keycode == 13) {
          alert("hello")
      }
    }
  </script>
  </body>
</html>
意訳
 


テキストエリア

idがtaの要素がクリックされたらta_keyupを実行する

この機能がやること
押されたキーコードを取得して
もし13なら(enter/returnのキーコードなら)
アラートを出す






JavaScriptでbody内でクリックした要素の情報を取得する event.target


Webページの画面の中のどこかをクリックした時にクリックされた要素の情報を取得するコードの例です


コード.gsでは以下のようなテキストエリアとパラグラフを例にしました


hi

それぞれの要素をクリックするとアラートに取得した情報が表示されます


今見ているこのページ自体にも同じコードを埋め込んでいるので
画面内のどこかをクリックするとその要素の情報がアラートに表示されます




コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <div>
      <textarea id="ta">hello</textarea>
      <p id="para">hi</p>
    </div>
    <script>
document.body.onclick = get_target;
function get_target(e){
  var target = e.target;
  alert([target, target.tagName, target.id, target.textContent]);
}
    </script>
  </body>
</html>
意訳
 


div
textarea
p


body内でクリックされたらget_targetを実行する
この機能がやること
クリックされた要素を取得して
その要素と、タグ名、id、テキストの内容をアラートに出す






2018年2月25日日曜日

JavaScriptで指定した要素の親要素を取得する


指定した要素の親要素を取得するコードの例です


コード.gsを実行すると

#document/html/body/div/p/textarea

のようにアラート表示されます



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <div>
      <p>
        <textarea id="ta">hello</textarea>
        <button id="bt">button</button>
      </p>
    </div>
    <script>
document.getElementById("bt").onclick = get_path;

function get_path() {
  var node = document.getElementById("ta");
  var result = node.nodeName;
  for(var i = 0; node.parentNode; i++){
    result = node.parentNode.nodeName + "/" + result;
    node = node.parentNode;
    }
    alert([result.toLowerCase(), i]);
}
    </script>
  </body>
</html>
意訳
 


div要素
p要素
テキストエリア
ボタン



idがbtの要素がクリックされたらget_pathを実行する

この機能がやること
idがtaの要素を取得して
そのnode名を取得して
そのnodeの親要素がある限り以下を繰り返す
親要素のnode名/node名
nodeにnodeの親要素を入れる

resultを小文字にしてiの値もログに出す






JavaScriptでinnerHTMLやtextContentの中身が変更された時に検知したい


MutationObserverで実現できたコードを書き残しておきます


デモ

0
abc



  1. startをクリックして監視を開始します
  2. changeをクリックします
    • 「0」には1が足されていきます
    • 「abc」は「ABC」に変更されます
  3. 変更された要素のidとtextContentがアラートに表示されます
  4. stopをクリックすると監視されなくなります




以下も見つけたけれど非推奨や廃止されていた



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <div id="div1">0</div>
    <div id="div2">abc</div>
    <button id="start">start</button>
    <button id="change">change</button>
    <button id="stop">stop</button>
    <script>
var div1 = document.getElementById('div1');
var div2 = document.getElementById('div2');
document.getElementById('start').onclick = start_observer;
document.getElementById('change').onclick = change_clicked;
document.getElementById('stop').onclick = stop_observer;

function change_clicked() {
  div1.textContent = parseInt(div1.textContent) + 1;
  div2.textContent = "ABC";
}

var observer;
function start_observer(){
  var config = get_config();
  observer = new MutationObserver(fnc);
  observer.observe(div1, config);
  observer.observe(div2, config);
}

function get_config(){
  var config = {
  childList: true
  }
  return config;
}

function fnc(mutations) {
  for (var i = 0; i < mutations.length; i++) {
    var mutation = mutations[i];
    alert([mutation.target.id, mutation.target.textContent]);
  }
}

function stop_observer(){
  if(observer){
    observer.disconnect();
  }
}
</script>
  </body>
</html>
意訳
 


div1
div2
変更を監視するstartボタン
textContentを変更するボタン
変更の監視を停止するボタン

idがdiv1の要素を取得する
idがdiv2の要素を取得する
idがstartの要素がクリックされた時にstart_observerを実行する
idがchangeの要素がクリックされた時にchange_clickedを実行する
idがstopの要素がクリックされた時にstop_observerを実行する

この機能がやること
div1のtextContentの数値に1足す
div2のtextContentをABCにする


observerを定義する
この機能がやること
configを取得して
MutationObserverを作成して監視対象が変更された時にコールバック関数(例ではfnc)を実行する
監視対象にdiv1要素とconfigを設定
監視対象にdiv2要素とconfigを設定


この機能がやること
configを作って
childListをtrueにして

返す


この機能がやること
mutations(監視対象の変更)の数だけ以下を繰り返す
変更された対象を一つずつ取得して
要素のidとtextContentをアラートに出す



この機能がやること
observerがtrueなら
observerで監視するのを止める







2018年2月24日土曜日

オブジェクトのプロパティディスクリプタを取得したい


備忘録シリーズ


オブジェクトのプロパティディスクリプタを取得したい時に

Object.getOwnPropertyDescriptor()

というのがある


2018年2月19日月曜日

JavaScriptでオブジェクトからすべての値を取得する


このようなオブジェクトがあって

var obj =
    {
      "aaa": "AAA",
      "bbb": "BBB",
      "ccc": "CCC"
    };


このようにvaluesを配列で取得したい



コード.gs
var obj = 
    {
      "aaa": "AAA",
      "bbb": "BBB",
      "ccc": "CCC"
    };
function get_values() {
  var keys = Object.keys(obj);
  var result = [];
  for (var i = 0; i < keys.length; i++) {
    var value = obj[keys[i]];
    result.push(value);
  }
  Logger.log(result);
}

意訳
オブジェクトを用意しておく





この機能がやること
オブジェクトのkeyをすべて取得して
結果を入れる配列を用意して
keysの数だけ以下を繰り返す
オブジェクトのkeyからvalueを取得して
resultに追加する

resultをログに出す




関連記事

JavaScriptでオブジェクトのkeys一覧を取得したい
JavaScriptでオブジェクトから値を取得する


参考

Object.keys()
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

2018年2月18日日曜日

JavaScriptで配列をシャッフルする(先頭の要素とランダム位置の要素を入れ替える)


こういう配列があって
["hare", "ame", "yuki", "kumori", "kaminari"]


このように順番を入れ替えてシャッフルしたい
yuki, kumori, kaminari, ame, hare


先頭の要素と他の要素(ランダムで決める)を入れ替えることを繰り返して取得する例



コード.gs
function shuffle(){
  var array = ["hare", "ame", "yuki", "kumori", "kaminari"]
  var len = array.length;
  for(var i = 0; i < len; i++){
    var rand = Math.floor(Math.random() * len);

    var array_0 = array[0];
    var array_rand = array[rand];

    array[rand] = array_0;
    array[0] = array_rand;
    Logger.log(array)
  }
  Logger.log("【result】" + array)
}
意訳
この機能は以下を実行する
シャッフルしたい配列を用意する
配列の要素数を取得する
以下を要素数分繰り返す
ランダム値に配列の要素数をかけて小数点を切り捨てて、配列の何番目の要素を入れ替えるかランダムで決める

arrayの先頭の要素
arrayのランダム位置の要素

先頭の要素にランダム位置の要素を入れて
ランダム位置の要素に先頭の要素を入れる
2つの位置を入れ替えた配列をログに出す

最終的に出来上がった配列をログに出す



実行結果


Google Visualization APIでシートのデータを取得する


シート上ではQuery関数でSQLを書けますが
スクリプトで実現する方法を探し回ってたどり着いたのが
Google Visualization APIでした

色々試して実現できたコード.gsを書き残しておきます


今回の例で用いたシートのデータ

以下のようなデータが入力されていて
ABC
1あいうえおアイウエオ
2かきくけこカキクケコ
3


"SELECT A, B"
↑このようなクエリを書いて


[[あいうえお, アイウエオ], [かきくけこ, カキクケコ]]
↑このような配列で取得する


ということを実現するコードの例です



コード.gs
var SS_ID = "SS_ID";
var SH_ID = SH_ID;
var BASE_URL = "https://docs.google.com/spreadsheets/d/";
var URL = BASE_URL + SS_ID + "/gviz/tq?gid=" + SH_ID + "&tqx=out:json&tq=";

SpreadsheetApp.openById(SS_ID);

function get_public_data() {
  var options = null;
  data_via_gviz(options);
}

function get_private_data() {
  var access_token = get_access_token();
  var headers = get_headers(access_token);
  var options = get_options(headers);
  data_via_gviz(options);
}

function get_access_token() {
  var access_token = ScriptApp.getOAuthToken();
  return access_token;
}

function get_headers(access_token) {
  var headers = {
    "Authorization": "Bearer " + access_token
  }
  return headers;
}

function get_options(headers) {
  var options = {
    "contentType": "application/json",
    "headers": headers,
    "muteHttpExceptions": true
  }
  return options;
}

function data_via_gviz(options) {
  var query = encodeURIComponent("SELECT A, B");
  var response = UrlFetchApp.fetch(URL + query, options);
  var jobj = get_jobj(response);
  var array = get_array(jobj);
  Logger.log([response, array]);
}

function get_jobj(response) {
  var data = response.getContentText();
  data = data.split("google.visualization.Query.setResponse(")[1];
  data = data.substr(0, data.length - 2);
  var jobj = JSON.parse(data);
  return jobj;
}

function get_array(jobj) {
  var rowlen = jobj["table"]["rows"].length;
  var collen = jobj["table"]["cols"].length;
  var array = [];
  for (var i = 0; i < rowlen; i++) {
    var values = [];
    for (var j = 0; j < collen; j++) {
      values.push(jobj["table"]["rows"][i]["c"][j]["v"]);
    }
    array.push(values);
  }
  return array;
}
意訳
スプレッドシートのID
対象のシートのID
BASE_URL
URLを作る

「Google ドライブのスプレッドシートの表示と管理」の権限を許可しておかないとprivateの場合にUnauthorizedでデータ取得できないので承認フローを入れる

この機能がやること 公開されているシートのデータを取得する
optionsにnullを入れて
data_via_gviz()に渡す


この機能がやること 非公開のシートのデータを取得する
get_access_token()からaccess_tokenを取得して
get_headers()に渡してheadersを取得して
get_options()に渡してoptionsを取得して
data_via_gviz()に渡す


この機能がやること
ScriptApp.getOAuthToken()でaccess_tokenを取得して
返す


この機能がやること
headersを作成して
access_tokenを入れて

返す


この機能がやること
optionsのオブジェクトを作って
contentTypeはapplication/jsonにして
headersを入れて
muteHttpExceptionsをtrueにして(fetchでエラーが出ても例外を投げない)

返す


この機能がやること
queryを作って
URL+queryとoptionsでfetchして
get_jobj()にresponseを渡してjobjに入れて
get_array()に渡してarrayに入れて
ログに出す


この機能がやること
渡されたresponseのテキストを取得して
指定した文字列以降を抜き出して
最後の二文字を消して( ); を消す)
JSON解析して
返す


この機能がやること
行数を取得して
列数を取得して
結果を入れる配列を用意して
一行ずつ以下を繰り返す
valuesの配列を用意して
一列ずつ以下を繰り返す
セルの値を取得してvaluesに追加する

values(一行分のデータ)をarrayに追加する

arrayを返す






補足


responseはこのようになっているので

/*O_o*/
google.visualization.Query.setResponse({
  "version": "0.6",
  "reqId": "0",
  "status": "ok",
  "sig": "1103093093",
  "table": {
    "cols": [{
      "id": "A",
      "label": "",
      "type": "string"
    }, {
      "id": "B",
      "label": "",
      "type": "string"
    }],
    "rows": [{
      "c": [{
        "v": "あいうえお"
      }, {
        "v": "アイウエオ"
      }]
    }, {
      "c": [{
        "v": "かきくけこ"
      }, {
        "v": "カキクケコ"
      }]
    }]
  }
});


コード.gs内の以下のコードで
google.visualization.Query.setResponse()内の文字列を抜き出しています
  • data = data.split("google.visualization.Query.setResponse(")[1];
  • data = data.substr(0, data.length - 2);


range.getValues()で取得する場合


シートIDを指定して.getValues()でデータを取得する例も書いておきます

var SS_ID = "SS_ID";
var SH_ID = SH_ID;

function get_values() {
  var ss = SpreadsheetApp.openById(SS_ID);
  var sh = get_sheet(ss, SH_ID);
  var range = sh.getRange("A1:B2");
  var values = range.getValues();
  Logger.log(values);
}

function get_sheet(ss, sh_id) {
  var shs = ss.getSheets();
  for (var i = 0; i < shs.length; i++) {
    if (shs[i].getSheetId() == sh_id) {
      break;
    }
  }
  var sh = ss.getSheets()[i];
  return sh;
}


PublicシートとPrivateシートの取得


SS_IDとSH_IDを指定してから
Publicシートの場合は get_public_data()
Privateシートの場合は get_private_data()
をそれぞれ実行するとデータを取得できます


Privateシートのデータの取得にはaccess tokenが必要で
ScriptApp.getOAuthToken() で取得しています



  • Webに公開されている(Public)シートのデータを取得する場合
    • get_public_data()を実行する
      • access_tokenの取得は不要なのでoptionsはnullにして
      • data_via_gviz(options)を実行する
  • 非公開(Private)シートのデータを取得する場合
    • get_private_data()を実行する
      • get_access_token()でaccess_tokenを取得して
        • get_headers(access_token)に渡して
        • get_options(headers)でoptionsを作って
      • data_via_gviz(options)に渡して実行する
      • SpreadsheetApp.openById(SS_ID)で「Google ドライブのスプレッドシートの表示と管理」の権限を許可するフローを入れてやると取得できるようになる


WHEREを使ってみる


上記コード.gsのdata_via_gviz(options){}内にある

var query = encodeURIComponent("SELECT A, B");



var query = encodeURIComponent("SELECT A, B WHERE A = 'あいうえお'");

としてやると


A列が あいうえお のA, B列の値を取得できる


trello APIをたたいてカードを作成する


Trelloの指定したリストにカードを登録するコードの例です


リストIDを取得する方法



コード.gs
var API_KEY = "API_KEY";
var TOKEN = "TOKEN";
var BASE_URL = "https://api.trello.com/1/cards";
var PARAMS = "?key=" + API_KEY + "&token=" + TOKEN;
var URL = BASE_URL + PARAMS;
var LIST_ID = "LIST_ID";

function create_card() {
  var payload = get_payload();
  var options = get_options(payload);
  var response = UrlFetchApp.fetch(URL, options);
  Logger.log(response);
}

function get_payload(list_id) {
  var payload = {
    "name": "タイトル",
    "desc": "内容を書く",
    "idList": LIST_ID
  }
  return payload;
}

function get_options(payload) {
  var options = {
    "method": "post",
    "muteHttpExceptions": true,
    "payload": payload
  }
  return options;
}
意訳
API_KEYを設定する
TOKENを設定する
BASE_URLを設定する
PARAMSを設定する
URLを設定する
カードを追加するリストを指定する

この機能がやること
get_payload()からpayloadを取得して
get_options()に渡してoptionsを取得して
URLとoptionsでfetchして
返ってきたresponseをログに出す


この機能がやること
payloadのオブジェクトを作って
カードのタイトルを入れて
詳細説明を入れて
リストのIDを入れて

返す


この機能がやること
optionsのオブジェクトを作って
methodをpostにして
muteHttpExceptionsをtrueにして(エラーを投げたい場合はfalse)
payloadを入れて

返す



参考

API Introduction
https://trello.readme.io/docs/api-introduction
  • TOKENを取得する
    • https://trello.com/app-key の Token リンクをクリックして次の画面で Allow(許可) をクリックすると取得できます

REST API Introduction
https://developers.trello.com/reference#introduction

trello APIをたたいて情報を取得する


指定した情報を取得するコードの例です

REST API Introduction の中から以下7つを取得してみます
  1. 自分がアクセスできるボード一覧
  2. ボードの中のリスト一覧
  3. ボードの中のカード一覧
  4. リストの中のカード一覧
  5. ボードの情報
  6. リストの情報
  7. カードの情報



コード.gs
var API_KEY = "API_KEY";
var TOKEN = "TOKEN";
var BASE_URL = "https://api.trello.com/1/";
var PARAMS = "?key=" + API_KEY + "&token=" + TOKEN;

var ITEM = 'members/me/boards';
//var ITEM = "boards/BoardID/lists";
//var ITEM = "boards/BoardID/cards";
//var ITEM = "lists/ListID/cards";
//var ITEM = "boards/BoardID/";
//var ITEM = "lists/ListID/";
//var ITEM = "cards/CardID/";

function get_response() {
  var url = BASE_URL + INFO + PARAMS;
  var options = get_options();
  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response);
}

function get_options(){
  var options = {
       'method': 'get',
       'muteHttpExceptions': true,
     }
  return options;
}
意訳
API_KEY
TOKEN
BASE_URL
PARAMS

自分がアクセスできるボード一覧
ボードの中のリスト一覧
ボードの中のカード一覧
リストの中のカード一覧
ボードの情報
リストの情報
カードの情報

この機能がやること
BASE_URL + INFO + PARAMSをurlに入れて
get_options()に渡してoptionsを取得して
urlとoptionsでfetchして
返ってきたresponseをログに出す


この機能がやること
optionsのオブジェクトを作って
methodをgetにして
muteHttpExceptionsをtrueにして(エラーを投げたい場合はfalse)

返す



補足


var ITEM = "boards/Iu1jCZkQ/lists";
でボードのIDを指定してそのリスト一覧を取得しています

2〜6はコード.gsの中ではコメントアウトしています
//を消すとそれぞれの情報を取得できます


ボードのIDとは


  • ボードを開いた状態でアドレスバーのBoardIDの位置にある文字列です


リストIDとは

  • var ITEM = "boards/BoardID/lists"
    で取得したリスト一覧にIDが記載されています


カードIDとは

  • カードを表示した状態でアドレスバーのCardIDの位置にある文字列です
  • var ITEM = "boards/BoardID/cards"
  • var ITEM = "lists/ListID/cards"
    で取得したカード一覧にもIDが記載されています


参考

API Introduction
https://trello.readme.io/docs/api-introduction
  • TOKENを取得する
    • https://trello.com/app-key の トークンリンクをクリックして次の画面で Allow(許可) をクリックすると取得できます

※ログインしていないとこういう画面が開きます


REST API Introduction
https://developers.trello.com/reference#introduction

2018年2月17日土曜日

asana APIをたたいてタスクの情報を取得する


asanaのAPIをたたいて指定したタスクの情報を取得するコードの例です



コード.gs
var TOKEN = "TOKEN";
var END_POINT = "https://app.asana.com/api/1.0/tasks/";

function GET_asana() {
  var headers = get_headers();
  var options = get_options(headers);
  var task_id = ID;
  var url = END_POINT + task_id;
  var response = UrlFetchApp.fetch(url, options);
  var jobj = JSON.parse(response);
  var task_title = jobj["data"]["name"];
  Logger.log([jobj, task_title]);
}

function get_headers() {
  var headers = {
    "Authorization": "Bearer " + TOKEN
  }
  return headers;
}

function get_options(headers) {
  var options = {
    "method": "get",
    "contentType": "application/json",
    "headers": headers,
    "muteHttpExceptions": true
  }
  return options;
}
意訳
TOKENを設定する
END_POINTを設定する

この機能がやること
get_headers()からheadersを取得して
get_email()からemailを取得して
取得するタスクIDを指定して
urlを作成して
urlにoptionsを付けてfetchする
responseをJSON.parseして
タイトルを取得して
jobjとタイトルをログに出す


この機能がやること
headersを作成して
TOKENを入れて

返す


この機能がやること
optionsのオブジェクトを作って
methodはgetにして
contentTypeはapplication/jsonにして
headersを入れて
muteHttpExceptionsをtrueにして(fetchでエラーが出ても例外を投げない)

返す



参考

GET A TASK
https://asana.com/developers/api-reference/tasks#get

asana APIをたたいて情報を取得する


詳細はasana Developersの公式サイトの
API Reference に記載されている一部を表にしたものです

asanaにログインした状態で各idを指定して開くと情報を取得できます


ワークスペース一覧を取得するhttps://app.asana.com/api/1.0/workspaces
プロジェクト一覧を取得するhttps://app.asana.com/api/1.0/projects
プロジェクトを指定してタスク一覧を取得するhttps://app.asana.com/api/1.0/projects/project-id/tasks
プロジェクトを指定してセクション一覧を取得するhttps://app.asana.com/api/1.0/projects/project-id/sections
タスクを指定して更新履歴一覧を取得するhttps://app.asana.com/api/1.0/tasks/task-id/stories
タスクを指定してサブタスクを取得するhttps://app.asana.com/api/1.0/tasks/task-id/subtasks
タグ一覧を取得するhttps://app.asana.com/api/1.0/tags
ユーザ一覧を取得するhttps://app.asana.com/api/1.0/users
自分のユーザ情報を取得するhttps://app.asana.com/api/1.0/users/me


asana APIをたたいて新規タスクを登録する


asanaのAPIをたたいて新規タスクを登録するコードの例です


TOKENの取得方法はhttps://asana.com/guide/help/api/apiに記載されているように
My Profile Settings...→Apps→Manage Developer Apps→Create New Personal Access Token
で取得できます


WORKSPACE_IDはasanaにログインした状態で
https://app.asana.com/api/1.0/workspaces
を開くと取得できます



コード.gs
var TOKEN = "TOKEN";
var END_POINT = "https://app.asana.com/api/1.0/tasks";
var WORKSPACE_ID = "ID";
var PROJECT_ID = "ID";
var TAG1 = "ID";
var TAG2 = "ID";

function POST_to_asana() {
  var headers = get_headers();
  var email = get_email();
  var payload = get_payload(email);
  var options = get_options(headers, payload);
  var response = UrlFetchApp.fetch(END_POINT, options);
  var jobj = JSON.parse(response);
  var task_id = jobj["data"]["id"];
  Logger.log([jobj, task_id.toString(10)]);
}

function get_headers() {
  var headers = {
    "Authorization": "Bearer " + TOKEN
  }
  return headers;
}

function get_email() {
  return Session.getActiveUser().getEmail();
}

function get_payload(email) {
  var followers = [email];
  var title = "TITLE";
  var detail = "created_by: " + email + "\n\n" + "DETAIL";
  var tags = [TAG1, TAG2];
  var data = {
    "data": {
      "workspace": WORKSPACE_ID,
      "projects": [PROJECT_ID],
      "name": title,
      "notes": detail,
      "followers": followers,
      "tags": tags
    }
  }
  var json = JSON.stringify(data);
  return json;
}

function get_options(headers, payload) {
  var options = {
    "method": "post",
    "contentType": "application/json",
    "headers": headers,
    "payload": payload,
    "muteHttpExceptions": true
  }
  return options;
}
意訳
TOKENを設定する
END_POINTを設定する
WORKSPACE_IDを設定する
PROJECT_IDを設定する
TAG1のIDを設定する
TAG2のIDを設定する

この機能がやること
get_headers()からheadersを取得して
get_email()からemailを取得して
get_payload()にemailを渡してpayloadを取得して
get_options()にheaders,とpayloadを渡してoptionsを取得して
END_POINTにoptionsを付けてfetchする
responseをJSON.parseして
task_idを取得(指数表記で返ってくるので10進数の文字列にしてみる)
jobjと作成したtask_idをログに出す


この機能がやること
headersを作成して
TOKENを入れて

返す


この機能がやること
アクティブユーザのemailを取得して返す


この機能がやること
渡されたemailをfollowersに入れて
タイトルを設定して
詳細を設定して
タグを設定して
dataオブジェクトを作って

WORKSPACE_IDを入れて
PROJECT_IDを入れて
nameにタイトルを入れて
notesに詳細を入れて
followersを入れて
tagsを入れて


JSONに変換して
返す


この機能がやること
optionsのオブジェクトを作って
methodはpostにして
contentTypeはapplication/jsonにして
headersを入れて
payloadを入れて
muteHttpExceptionsをtrueにして(fetchでエラーが出ても例外を投げない)

返す



参考

asana
https://asana.com/guide/help/fundamentals/about-asana

CREATE A TASK
https://asana.com/developers/api-reference/tasks#create

Personal Access Token
https://asana.com/developers/documentation/getting-started/auth#personal-access-token

TOKEN取得方法
My Profile Settings...→Apps
→Manage Developer Apps→Create New Personal Access Token
https://asana.com/guide/help/api/api

2018年2月16日金曜日

シート内の空白の行と列を削除する


シート内で使っていない行や列を削除したくて書いたコードです

A12行までデータが入っていて
E列までデータが入っている
このようなシートがあるとき

範囲外(データが入っていない)の行と列を削除する

以下のコード.gsの SHEET_ID に対象のシートIDを入れて
delete_blank_rows_cols() を実行すると空白の行と列が削除されます



コード.gs
function delete_blank_rows_cols(){
 var sh_id = SHEET_ID;
 var sh = get_sheet(sh_id);
 var last_row = sh.getLastRow();
 var last_col = sh.getLastColumn();
 var max_row = sh.getMaxRows();
 var max_col = sh.getMaxColumns();
 var start_row = last_row + 1;
 var start_col = last_col + 1;
 var num_rows = max_row - last_row;
 var num_cols = max_col - last_col;
 sh.deleteRows(start_row, num_rows);
 sh.deleteColumns(start_col, num_cols);
}

function get_sheet(sh_id) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var shs = ss.getSheets();
  for (var i = 0; i < shs.length; i++) {
    if (shs[i].getSheetId() == sh_id) {
      break;
    }
  }
  var sh = ss.getSheets()[i];
  return sh;
}
意訳
この機能がやること
シートIDを指定して
get_sheet()に渡してシートを取得して
データが入っている最終行を取得して
データが入っている最終列を取得して
シート全体の最終行を取得して
シート全体の最終列を取得して
last_rowのひとつ下の行を指定して
last_colの1つ右の列を指定して
空白の行数を指定して
空白の列数を指定して
削除する行の範囲を指定して削除する
削除する列の範囲を指定して削除する


この機能がやること
現在開いているスプレッドシートを取得して
シートをすべて取得して
シートの数だけ以下を繰り返す
シートのIDが渡されたシートIDなら
for文から抜ける


対象のシートを取得して
返す



関連記事

シートの行を削除する
シートの列を削除する


スプレッドシートアドオンとして公開しました

https://chrome.google.com/webstore/detail/delete-blank-sheet-range/blojpbpagmombfdkjlddfjjmpmgopckb?utm_source=chrome-ntp-icon


アドオンのコード

コード.gs
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createAddonMenu()
      .addItem('delete', 'deleteBlankRowsCols')
      .addToUi();
}

function onInstall(e) {
  onOpen(e);
}

function deleteBlankRowsCols(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var last_row = sheet.getLastRow();
  var last_col = sheet.getLastColumn();
  if(last_row === 0 && last_col === 0) {
    Browser.msgBox("Can't delete. This sheet has no data.");
  } else {
   var max_row = sheet.getMaxRows();
   var max_col = sheet.getMaxColumns();
   var start_row = last_row + 1;
   var start_col = last_col + 1;
   var num_rows = max_row - last_row;
   var num_cols = max_col - last_col;
   var delet_rows = 0;//消す行を0で初期化
   var delet_cols = 0;//消す列を0で初期化
   if(num_rows > 0) {//消す行があれば
     sheet.deleteRows(start_row, num_rows);
     delet_rows = num_rows;
   }
   if(num_cols > 0) {//消す列があれば
     sheet.deleteColumns(start_col, num_cols);
     delet_cols = num_cols;
   }
    Browser.msgBox("Deleted: Row: " + delet_rows + ", Col: " + num_cols);
  }
}


行列を入れ替えるTRANSPOSE関数


スクリプトの話ではありませんが
行列を入れ替えたい時によく使うTRANSPOSE関数の備忘録です


A列にこのようなデータがあるとき
ABCDEF
1aaa
2bbb
3ccc
4ddd
5eee
6


B1セルに =transpose(B3:B6) と入力して確定すると


列のデータを一行にできる
ABCDEF
1aaabbbcccdddeee
2bbb
3ccc
4ddd
5eee
6



編集メニューからやる場合


A2からA5をコピーしてから


編集→特殊貼付け→転置して貼り付け


すると同じように列から行へデータを貼り付けられる


参考

ドキュメント エディタ ヘルプ TRANSPOSE
https://support.google.com/docs/answer/3094262?hl=ja

Latest post

Googleドライブのファイルを指定フォルダに移動したい - Move a file to a specific folder in Google Drive via Apps Script

Googleドライブのファイル移動を簡単にしたくて書いたコードです。 I wrote this code to make it easier to move files in Google Drive. 移動したいファイルURLと移動先のフォルダURLを入力して移動するWebアプ...