<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5776980471135706903</id><updated>2026-08-09T02:18:02.216+07:00</updated><category term="Tips Dan Trick"/><category term="Artikel"/><category term="Technology"/><category term="Lain-lain"/><category term="OOP"/><category term="Google Apps Script"/><category term="Tutorial"/><category term="React"/><category term="Video"/><category term="ChatGPT"/><category term="DevExpress"/><category term="Self Improvement"/><category term="Download"/><category term="Design Pattern"/><category term="Fast Report"/><category term="Open Source"/><title type='text'>Delphi Guru</title><subtitle type='html'>OOP, Tips, Trick, Free E-Book, Free Tutorial, Free Source Code, All About Delphi, Cerita Kehidupan, Technology</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>79</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-1800188699455561662</id><published>2025-12-11T09:38:00.004+07:00</published><updated>2025-12-11T09:38:47.387+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>⭐ Belajar React #5 — Handling Events &amp; Controlled Components</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Setelah mempelajari &lt;strong data-end=&quot;275&quot; data-start=&quot;223&quot;&gt;&lt;a href=&quot;/2025/12/belajar-react-4-conditional-rendering.html&quot; target=&quot;_blank&quot;&gt;state, conditional rendering, dan list rendering&lt;/a&gt;&lt;/strong&gt;, sekarang kita masuk ke bagian penting lain dari React:&lt;/p&gt;&lt;p data-end=&quot;477&quot; data-start=&quot;203&quot;&gt;
&lt;strong data-end=&quot;368&quot; data-start=&quot;334&quot;&gt;Bagaimana cara menangani event&lt;/strong&gt; (klik, input, submit) dan &lt;strong data-end=&quot;435&quot; data-start=&quot;395&quot;&gt;bagaimana mengontrol data dalam form&lt;/strong&gt; melalui konsep &lt;strong data-end=&quot;476&quot; data-start=&quot;451&quot;&gt;Controlled Components&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;585&quot; data-start=&quot;479&quot;&gt;Dua konsep ini adalah fondasi untuk membuat form, search bar, login form, dan hampir semua interaksi user.&lt;/p&gt;
&lt;hr data-end=&quot;590&quot; data-start=&quot;587&quot; /&gt;
&lt;h1 data-end=&quot;625&quot; data-start=&quot;592&quot;&gt;🎯 Apa yang Akan Kamu Pelajari?&lt;/h1&gt;
&lt;ol data-end=&quot;903&quot; data-start=&quot;627&quot;&gt;
&lt;li data-end=&quot;661&quot; data-start=&quot;627&quot;&gt;
&lt;p data-end=&quot;661&quot; data-start=&quot;630&quot;&gt;Cara menangani event di React&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;716&quot; data-start=&quot;662&quot;&gt;
&lt;p data-end=&quot;716&quot; data-start=&quot;665&quot;&gt;Perbedaan event handler React vs JavaScript biasa&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;750&quot; data-start=&quot;717&quot;&gt;
&lt;p data-end=&quot;750&quot; data-start=&quot;720&quot;&gt;Apa itu Controlled Component&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;807&quot; data-start=&quot;751&quot;&gt;
&lt;p data-end=&quot;807&quot; data-start=&quot;754&quot;&gt;Cara membuat input yang selalu sinkron dengan state&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;860&quot; data-start=&quot;808&quot;&gt;
&lt;p data-end=&quot;860&quot; data-start=&quot;811&quot;&gt;Form handling lengkap (input, textarea, select)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;861&quot;&gt;
&lt;p data-end=&quot;903&quot; data-start=&quot;864&quot;&gt;Contoh aplikasi: Form Login sederhana&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;908&quot; data-start=&quot;905&quot; /&gt;
&lt;h1 data-end=&quot;942&quot; data-start=&quot;910&quot;&gt;🟦 1. Handling Events di React&lt;/h1&gt;
&lt;p data-end=&quot;1037&quot; data-start=&quot;944&quot;&gt;React menggunakan event handler yang mirip seperti JavaScript, tetapi ada beberapa perbedaan:&lt;/p&gt;
&lt;h3 data-end=&quot;1081&quot; data-start=&quot;1039&quot;&gt;✔ Penamaan event menggunakan camelCase&lt;/h3&gt;
&lt;p data-end=&quot;1094&quot; data-start=&quot;1083&quot;&gt;HTML biasa:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1153&quot; data-start=&quot;1096&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;handleClick()&quot;&lt;/span&gt;&amp;gt;Klik&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1161&quot; data-start=&quot;1155&quot;&gt;React:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1217&quot; data-start=&quot;1163&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&amp;lt;button onClick={handleClick}&amp;gt;&lt;span class=&quot;hljs-title class_&quot;&gt;Klik&lt;/span&gt;&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1222&quot; data-start=&quot;1219&quot; /&gt;
&lt;h3 data-end=&quot;1291&quot; data-start=&quot;1224&quot;&gt;✔ Event handler ditulis sebagai fungsi JavaScript, bukan string&lt;/h3&gt;
&lt;p data-end=&quot;1298&quot; data-start=&quot;1293&quot;&gt;HTML:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1355&quot; data-start=&quot;1300&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;alert(&#39;hi&#39;)&quot;&lt;/span&gt;&amp;gt;Klik&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1363&quot; data-start=&quot;1357&quot;&gt;React:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1425&quot; data-start=&quot;1365&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&amp;lt;button onClick={&lt;span class=&quot;hljs-function&quot;&gt;() =&amp;gt;&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;hi&quot;&lt;/span&gt;)}&amp;gt;&lt;span class=&quot;hljs-title class_&quot;&gt;Klik&lt;/span&gt;&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1430&quot; data-start=&quot;1427&quot; /&gt;
&lt;h1 data-end=&quot;1457&quot; data-start=&quot;1432&quot;&gt;🔹 Contoh Event Handler&lt;/h1&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1619&quot; data-start=&quot;1459&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;ButtonExample&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;handleClick&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
    &lt;span class=&quot;hljs-title function_&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Tombol ditekan!&quot;&lt;/span&gt;);
  }

  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{handleClick}&lt;/span&gt;&amp;gt;Klik Saya&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;;
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1647&quot; data-start=&quot;1621&quot;&gt;Atau versi arrow function:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1700&quot; data-start=&quot;1649&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&amp;lt;button onClick={&lt;span class=&quot;hljs-function&quot;&gt;() =&amp;gt;&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Klik&quot;&lt;/span&gt;)} /&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1705&quot; data-start=&quot;1702&quot; /&gt;
&lt;h1 data-end=&quot;1744&quot; data-start=&quot;1707&quot;&gt;🟦 2. Apa Itu Controlled Component?&lt;/h1&gt;
&lt;p data-end=&quot;1860&quot; data-start=&quot;1746&quot;&gt;&lt;strong data-end=&quot;1770&quot; data-start=&quot;1746&quot;&gt;Controlled Component&lt;/strong&gt; adalah elemen form (input, textarea, select) yang &lt;em data-end=&quot;1859&quot; data-start=&quot;1821&quot;&gt;nilai-nya dikontrol oleh state React&lt;/em&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1870&quot; data-start=&quot;1862&quot;&gt;Artinya:&lt;/p&gt;
&lt;ul data-end=&quot;1956&quot; data-start=&quot;1871&quot;&gt;
&lt;li data-end=&quot;1956&quot; data-start=&quot;1871&quot;&gt;
&lt;p data-end=&quot;1956&quot; data-start=&quot;1873&quot;&gt;User mengetik → React menangkap input → React memperbarui state → state mengubah UI&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1974&quot; data-start=&quot;1958&quot;&gt;Alurnya menjadi:&lt;/p&gt;
&lt;p data-end=&quot;2003&quot; data-start=&quot;1976&quot;&gt;&lt;strong data-end=&quot;2003&quot; data-start=&quot;1976&quot;&gt;UI → Event → State → UI&lt;/strong&gt;&lt;/p&gt;
&lt;p data-end=&quot;2072&quot; data-start=&quot;2005&quot;&gt;Inilah yang membuat React UI selalu konsisten dengan data aplikasi.&lt;/p&gt;
&lt;hr data-end=&quot;2077&quot; data-start=&quot;2074&quot; /&gt;
&lt;h1 data-end=&quot;2107&quot; data-start=&quot;2079&quot;&gt;🔹 Contoh Controlled Input&lt;/h1&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;2413&quot; data-start=&quot;2109&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;import&lt;/span&gt; { useState } &lt;span class=&quot;hljs-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;react&quot;&lt;/span&gt;;

&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;NameInput&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; [name, setName] = &lt;span class=&quot;hljs-title function_&quot;&gt;useState&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;&quot;&lt;/span&gt;);

  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; (
    &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt;
      &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;input&lt;/span&gt;&lt;/span&gt; 
        &lt;span class=&quot;hljs-attr&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{name}&lt;/span&gt;
        &lt;span class=&quot;hljs-attr&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{(e)&lt;/span&gt; =&amp;gt; setName(e.target.value)}
        placeholder=&quot;Masukkan nama&quot;
      /&amp;gt;
      &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;Halo, {name}&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;div&lt;/span&gt;&lt;/span&gt;&amp;gt;
  );
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2423&quot; data-start=&quot;2415&quot;&gt;Di sini:&lt;/p&gt;
&lt;ul data-end=&quot;2524&quot; data-start=&quot;2424&quot;&gt;
&lt;li data-end=&quot;2468&quot; data-start=&quot;2424&quot;&gt;
&lt;p data-end=&quot;2468&quot; data-start=&quot;2426&quot;&gt;&lt;code data-end=&quot;2440&quot; data-start=&quot;2426&quot;&gt;value={name}&lt;/code&gt; → UI dikontrol oleh state&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2524&quot; data-start=&quot;2469&quot;&gt;
&lt;p data-end=&quot;2524&quot; data-start=&quot;2471&quot;&gt;&lt;code data-end=&quot;2481&quot; data-start=&quot;2471&quot;&gt;onChange&lt;/code&gt; → mengubah state setiap kali user mengetik&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2529&quot; data-start=&quot;2526&quot; /&gt;
&lt;h1 data-end=&quot;2558&quot; data-start=&quot;2531&quot;&gt;🟦 3. Controlled Textarea&lt;/h1&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;2648&quot; data-start=&quot;2560&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&amp;lt;textarea
  value={message}
  onChange={&lt;span class=&quot;hljs-function&quot;&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;hljs-title function_&quot;&gt;setMessage&lt;/span&gt;(e.&lt;span class=&quot;hljs-property&quot;&gt;target&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;)}
/&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2759&quot; data-start=&quot;2650&quot;&gt;Pada React, &lt;code data-end=&quot;2672&quot; data-start=&quot;2662&quot;&gt;textarea&lt;/code&gt; diperlakukan sama dengan &lt;code data-end=&quot;2705&quot; data-start=&quot;2698&quot;&gt;input&lt;/code&gt;. Tidak lagi menggunakan innerText seperti HTML biasa.&lt;/p&gt;
&lt;hr data-end=&quot;2764&quot; data-start=&quot;2761&quot; /&gt;
&lt;h1 data-end=&quot;2802&quot; data-start=&quot;2766&quot;&gt;🟦 4. Controlled Select (Dropdown)&lt;/h1&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;3010&quot; data-start=&quot;2804&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&amp;lt;select value={selected} onChange={&lt;span class=&quot;hljs-function&quot;&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;hljs-title function_&quot;&gt;setSelected&lt;/span&gt;(e.&lt;span class=&quot;hljs-property&quot;&gt;target&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;)}&amp;gt;
  &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;&quot;&lt;/span&gt;&amp;gt;Pilih warna&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;option&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;red&quot;&lt;/span&gt;&amp;gt;Merah&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;option&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&amp;gt;Biru&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;option&lt;/span&gt;&lt;/span&gt;&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;3015&quot; data-start=&quot;3012&quot; /&gt;
&lt;h1 data-end=&quot;3059&quot; data-start=&quot;3017&quot;&gt;🟩 Contoh Aplikasi: Form Login Sederhana&lt;/h1&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;3974&quot; data-start=&quot;3061&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;useState&lt;/span&gt; } &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;react&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;LoginForm&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; [&lt;span style=&quot;color: #4fc1ff;&quot;&gt;email&lt;/span&gt;, &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setEmail&lt;/span&gt;] &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;useState&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; [&lt;span style=&quot;color: #4fc1ff;&quot;&gt;password&lt;/span&gt;, &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setPassword&lt;/span&gt;] &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;useState&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;handleSubmit&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;preventDefault&lt;/span&gt;(); &lt;span style=&quot;color: #6a9955;&quot;&gt;// Mencegah reload halaman&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;alert&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;`Email: &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;email&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;Password: &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;`&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;form&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onSubmit&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;handleSubmit&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Login&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Email&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;input&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;email&quot;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;email&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onChange&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;setEmail&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Masukkan email&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Password&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;input&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;password&quot;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onChange&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;setPassword&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Masukkan password&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Login&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;LoginForm&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4019&quot; data-start=&quot;3976&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjrGKmKTwHFZvOngoYDpf3XegYpyaPgeYjQdLu3PJy3yhe47jBvCzMmx_KXplKKVXU3ZTVm31k2yyEjlZrIn6KntusjMYYfz8ZIjySGWMrMIdcD9xE_l6rg5CGofrD2lqidTVH8NHZYgNZWt72_MN5iNFawAxvbLLbdJ5LcCg7E23PwEsGfxNIBaPXXJpxJ&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Form Login React&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1360&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjrGKmKTwHFZvOngoYDpf3XegYpyaPgeYjQdLu3PJy3yhe47jBvCzMmx_KXplKKVXU3ZTVm31k2yyEjlZrIn6KntusjMYYfz8ZIjySGWMrMIdcD9xE_l6rg5CGofrD2lqidTVH8NHZYgNZWt72_MN5iNFawAxvbLLbdJ5LcCg7E23PwEsGfxNIBaPXXJpxJ=w640-h362&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p data-end=&quot;4019&quot; data-start=&quot;3976&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p data-end=&quot;4019&quot; data-start=&quot;3976&quot;&gt;Konsep controlled components sudah lengkap:&lt;/p&gt;
&lt;ul data-end=&quot;4132&quot; data-start=&quot;4020&quot;&gt;
&lt;li data-end=&quot;4057&quot; data-start=&quot;4020&quot;&gt;
&lt;p data-end=&quot;4057&quot; data-start=&quot;4022&quot;&gt;Setiap input dikontrol oleh state&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4096&quot; data-start=&quot;4058&quot;&gt;
&lt;p data-end=&quot;4096&quot; data-start=&quot;4060&quot;&gt;Event &lt;code data-end=&quot;4076&quot; data-start=&quot;4066&quot;&gt;onChange&lt;/code&gt; memperbarui nilai&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4132&quot; data-start=&quot;4097&quot;&gt;
&lt;p data-end=&quot;4132&quot; data-start=&quot;4099&quot;&gt;Event &lt;code data-end=&quot;4115&quot; data-start=&quot;4105&quot;&gt;onSubmit&lt;/code&gt; memproses form&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4137&quot; data-start=&quot;4134&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Pada artikel ini kamu belajar:&lt;/p&gt;
&lt;p data-end=&quot;4381&quot; data-start=&quot;4188&quot;&gt;✔ Cara menangani event di React&lt;br data-end=&quot;4222&quot; data-start=&quot;4219&quot; /&gt;
✔ Perbedaan event handler React vs HTML biasa&lt;br data-end=&quot;4270&quot; data-start=&quot;4267&quot; /&gt;
✔ Konsep Controlled Components&lt;br data-end=&quot;4303&quot; data-start=&quot;4300&quot; /&gt;
✔ Input, textarea, select dengan state&lt;br data-end=&quot;4344&quot; data-start=&quot;4341&quot; /&gt;
✔ Cara membuat form login sederhana&lt;/p&gt;
&lt;p data-end=&quot;4453&quot; data-start=&quot;4383&quot;&gt;Konsep ini adalah pondasi dari semua form dan interaksi user di React.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/1800188699455561662/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-5-handling-events.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1800188699455561662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1800188699455561662'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-5-handling-events.html' title='⭐ Belajar React #5 — Handling Events &amp; Controlled Components'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjrGKmKTwHFZvOngoYDpf3XegYpyaPgeYjQdLu3PJy3yhe47jBvCzMmx_KXplKKVXU3ZTVm31k2yyEjlZrIn6KntusjMYYfz8ZIjySGWMrMIdcD9xE_l6rg5CGofrD2lqidTVH8NHZYgNZWt72_MN5iNFawAxvbLLbdJ5LcCg7E23PwEsGfxNIBaPXXJpxJ=s72-w640-h362-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-1553205636205568049</id><published>2025-12-11T09:19:00.002+07:00</published><updated>2025-12-11T09:40:20.617+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>⭐ Belajar React #4 — Conditional Rendering &amp; List Rendering</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada &lt;a href=&quot;/2025/12/belajar-react-3-memahami-state-event.html&quot; target=&quot;_blank&quot;&gt;artikel sebelumnya&lt;/a&gt;, kita sudah membahas tentang &lt;strong data-end=&quot;254&quot; data-start=&quot;245&quot;&gt;State&lt;/strong&gt; dan bagaimana ia mengubah tampilan UI secara dinamis. Sekarang saatnya mempelajari dua konsep penting dalam React yang akan sangat sering digunakan di proyek nyata:&lt;/p&gt;&lt;p data-end=&quot;471&quot; data-start=&quot;192&quot;&gt;
&lt;strong data-end=&quot;447&quot; data-start=&quot;422&quot;&gt;Conditional Rendering&lt;/strong&gt; dan &lt;strong data-end=&quot;470&quot; data-start=&quot;452&quot;&gt;List Rendering&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;600&quot; data-start=&quot;473&quot;&gt;Keduanya sangat erat kaitannya dengan bagaimana React menampilkan UI secara dinamis bergantung pada data atau kondisi tertentu.&lt;/p&gt;
&lt;hr data-end=&quot;605&quot; data-start=&quot;602&quot; /&gt;
&lt;h1 data-end=&quot;640&quot; data-start=&quot;607&quot;&gt;🎯 Apa yang Akan Kita Pelajari?&lt;/h1&gt;
&lt;ol data-end=&quot;897&quot; data-start=&quot;642&quot;&gt;
&lt;li data-end=&quot;676&quot; data-start=&quot;642&quot;&gt;
&lt;p data-end=&quot;676&quot; data-start=&quot;645&quot;&gt;Apa itu Conditional Rendering&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;738&quot; data-start=&quot;677&quot;&gt;
&lt;p data-end=&quot;738&quot; data-start=&quot;680&quot;&gt;Cara membuat kondisi dengan &lt;code data-end=&quot;712&quot; data-start=&quot;708&quot;&gt;if&lt;/code&gt;, &lt;code data-end=&quot;718&quot; data-start=&quot;714&quot;&gt;&amp;amp;&amp;amp;&lt;/code&gt;, dan ternary &lt;code data-end=&quot;736&quot; data-start=&quot;732&quot;&gt;?:&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;766&quot; data-start=&quot;739&quot;&gt;
&lt;p data-end=&quot;766&quot; data-start=&quot;742&quot;&gt;Apa itu List Rendering&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;814&quot; data-start=&quot;767&quot;&gt;
&lt;p data-end=&quot;814&quot; data-start=&quot;770&quot;&gt;Menggunakan &lt;code data-end=&quot;790&quot; data-start=&quot;782&quot;&gt;.map()&lt;/code&gt; untuk merender daftar&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;857&quot; data-start=&quot;815&quot;&gt;
&lt;p data-end=&quot;857&quot; data-start=&quot;818&quot;&gt;Menangani key agar tidak muncul error&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;897&quot; data-start=&quot;858&quot;&gt;
&lt;p data-end=&quot;897&quot; data-start=&quot;861&quot;&gt;Contoh praktik: To-Do list sederhana&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;902&quot; data-start=&quot;899&quot; /&gt;
&lt;h1 data-end=&quot;942&quot; data-start=&quot;904&quot;&gt;🟦 1. Apa Itu Conditional Rendering?&lt;/h1&gt;
&lt;p data-end=&quot;1049&quot; data-start=&quot;944&quot;&gt;Conditional Rendering adalah teknik untuk &lt;strong data-end=&quot;1048&quot; data-start=&quot;986&quot;&gt;menampilkan komponen/tampilan berdasarkan kondisi tertentu&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1069&quot; data-start=&quot;1051&quot;&gt;Analogi sederhana:&lt;/p&gt;
&lt;ul data-end=&quot;1161&quot; data-start=&quot;1070&quot;&gt;
&lt;li data-end=&quot;1117&quot; data-start=&quot;1070&quot;&gt;
&lt;p data-end=&quot;1117&quot; data-start=&quot;1072&quot;&gt;Jika user sudah login → tampilkan Dashboard&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1161&quot; data-start=&quot;1118&quot;&gt;
&lt;p data-end=&quot;1161&quot; data-start=&quot;1120&quot;&gt;Jika belum login → tampilkan tombol Login&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1254&quot; data-start=&quot;1163&quot;&gt;React tidak memiliki sintaks khusus untuk ini, cukup menggunakan ekspresi JavaScript biasa.&lt;/p&gt;
&lt;hr data-end=&quot;1259&quot; data-start=&quot;1256&quot; /&gt;
&lt;h1 data-end=&quot;1294&quot; data-start=&quot;1261&quot;&gt;🔹 Metode Conditional Rendering&lt;/h1&gt;
&lt;h2 data-end=&quot;1318&quot; data-start=&quot;1296&quot;&gt;&lt;strong data-end=&quot;1318&quot; data-start=&quot;1299&quot;&gt;1. IF Statement&lt;/strong&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1364&quot; data-start=&quot;1319&quot;&gt;Biasanya digunakan untuk logika yang panjang.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1516&quot; data-start=&quot;1366&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;Greeting&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;{ isLoggedIn }&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (isLoggedIn) {
    &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;h1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt;Selamat datang kembali!&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;h1&lt;/span&gt;&lt;/span&gt;&amp;gt;;
  }
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;h1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt;Silakan login&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;h1&lt;/span&gt;&lt;/span&gt;&amp;gt;;
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1521&quot; data-start=&quot;1518&quot; /&gt;
&lt;h2 data-end=&quot;1554&quot; data-start=&quot;1523&quot;&gt;&lt;strong data-end=&quot;1554&quot; data-start=&quot;1526&quot;&gt;2. Operator AND ( &lt;code data-end=&quot;1550&quot; data-start=&quot;1546&quot;&gt;&amp;amp;&amp;amp;&lt;/code&gt; )&lt;/strong&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1590&quot; data-start=&quot;1556&quot;&gt;Digunakan untuk kondisi sederhana.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1635&quot; data-start=&quot;1592&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;{isLoading &amp;amp;&amp;amp; &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt;Loading...&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1712&quot; data-start=&quot;1637&quot;&gt;Jika &lt;code data-end=&quot;1660&quot; data-start=&quot;1642&quot;&gt;isLoading = true&lt;/code&gt; → teks muncul.&lt;br data-end=&quot;1678&quot; data-start=&quot;1675&quot; /&gt;
Jika false → tidak muncul apa-apa.&lt;/p&gt;
&lt;hr data-end=&quot;1717&quot; data-start=&quot;1714&quot; /&gt;
&lt;h2 data-end=&quot;1765&quot; data-start=&quot;1719&quot;&gt;&lt;strong data-end=&quot;1765&quot; data-start=&quot;1722&quot;&gt;3. Ternary Operator &lt;code data-end=&quot;1763&quot; data-start=&quot;1744&quot;&gt;condition ? a : b&lt;/code&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1808&quot; data-start=&quot;1767&quot;&gt;Paling sering dipakai, rapi, dan singkat.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;1865&quot; data-start=&quot;1810&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;{isLoggedIn ? &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;Dashboard&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; /&amp;gt; : &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;LoginPage&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; /&amp;gt;}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1870&quot; data-start=&quot;1867&quot; /&gt;
&lt;h1 data-end=&quot;1903&quot; data-start=&quot;1872&quot;&gt;🟦 2. Apa Itu List Rendering?&lt;/h1&gt;
&lt;p data-end=&quot;2044&quot; data-start=&quot;1905&quot;&gt;List Rendering adalah proses &lt;strong data-end=&quot;1988&quot; data-start=&quot;1934&quot;&gt;menampilkan banyak elemen berdasarkan sebuah array&lt;/strong&gt;.&lt;br data-end=&quot;1992&quot; data-start=&quot;1989&quot; /&gt;
Caranya adalah menggunakan fungsi bawaan JavaScript:&lt;/p&gt;
&lt;h3 data-end=&quot;2058&quot; data-start=&quot;2046&quot;&gt;&lt;code data-end=&quot;2058&quot; data-start=&quot;2050&quot;&gt;.map()&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;2243&quot; data-start=&quot;2060&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; fruits = [&lt;span class=&quot;hljs-string&quot;&gt;&quot;Apple&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Banana&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Orange&quot;&lt;/span&gt;];

&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;FruitList&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; (
    &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;ul&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt;
      {fruits.map((fruit) =&amp;gt; (
        &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;li&lt;/span&gt;&lt;/span&gt;&amp;gt;{fruit}&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;li&lt;/span&gt;&lt;/span&gt;&amp;gt;
      ))}
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;ul&lt;/span&gt;&lt;/span&gt;&amp;gt;
  );
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2248&quot; data-start=&quot;2245&quot; /&gt;
&lt;h1 data-end=&quot;2302&quot; data-start=&quot;2250&quot;&gt;🔸 Penting! Setiap elemen list harus punya &lt;strong data-end=&quot;2302&quot; data-start=&quot;2295&quot;&gt;key&lt;/strong&gt;&lt;/h1&gt;
&lt;p data-end=&quot;2326&quot; data-start=&quot;2304&quot;&gt;React butuh key untuk:&lt;/p&gt;
&lt;ul data-end=&quot;2401&quot; data-start=&quot;2327&quot;&gt;
&lt;li data-end=&quot;2367&quot; data-start=&quot;2327&quot;&gt;
&lt;p data-end=&quot;2367&quot; data-start=&quot;2329&quot;&gt;Mengidentifikasi elemen yang berubah&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2401&quot; data-start=&quot;2368&quot;&gt;
&lt;p data-end=&quot;2401&quot; data-start=&quot;2370&quot;&gt;Meningkatkan performa rendering&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2421&quot; data-start=&quot;2403&quot;&gt;Contoh yang benar:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;2500&quot; data-start=&quot;2423&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;{fruits.&lt;span class=&quot;hljs-title function_&quot;&gt;map&lt;/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;(&lt;span class=&quot;hljs-params&quot;&gt;fruit, index&lt;/span&gt;&lt;/span&gt;) =&amp;gt; (
  &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;li&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{index}&lt;/span&gt;&amp;gt;{fruit}&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;li&lt;/span&gt;&lt;/span&gt;&amp;gt;
))}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2634&quot; data-start=&quot;2502&quot;&gt;Namun &lt;strong data-end=&quot;2548&quot; data-start=&quot;2508&quot;&gt;hindari penggunaan index sebagai key&lt;/strong&gt; jika datanya bisa berubah posisi, tambah, hapus, dsb.&lt;br data-end=&quot;2605&quot; data-start=&quot;2602&quot; /&gt;
Lebih baik gunakan &lt;code data-end=&quot;2628&quot; data-start=&quot;2624&quot;&gt;id&lt;/code&gt; unik:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;2743&quot; data-start=&quot;2636&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; todos = [
  { &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-attr&quot;&gt;text&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&quot;Belajar React&quot;&lt;/span&gt; },
  { &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;hljs-attr&quot;&gt;text&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&quot;Membaca dokumentasi&quot;&lt;/span&gt; },
];
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2748&quot; data-start=&quot;2745&quot; /&gt;
&lt;h1 data-end=&quot;2791&quot; data-start=&quot;2750&quot;&gt;🟩 Contoh Praktik: To-Do List Sederhana&lt;/h1&gt;
&lt;pre class=&quot;overflow-visible! px-0!&quot; data-end=&quot;3582&quot; data-start=&quot;2793&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-jsx&quot;&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;useState&lt;/span&gt; } &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;react&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;TodoApp&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; [&lt;span style=&quot;color: #4fc1ff;&quot;&gt;todos&lt;/span&gt;, &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setTodos&lt;/span&gt;] &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;useState&lt;/span&gt;([&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Belajar React&quot;&lt;/span&gt; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Ngopi dulu&quot;&lt;/span&gt; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; ]);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; [&lt;span style=&quot;color: #4fc1ff;&quot;&gt;input&lt;/span&gt;, &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setInput&lt;/span&gt;] &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;useState&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;addTodo&lt;/span&gt; &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; () &lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setTodos&lt;/span&gt;([&lt;span style=&quot;color: #d4d4d4;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;todos&lt;/span&gt;, { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #4ec9b0;&quot;&gt;Date&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;now&lt;/span&gt;(), &lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #4fc1ff;&quot;&gt;input&lt;/span&gt; }]);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setInput&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; };&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;To-Do List&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;input&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onChange&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;setInput&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Tambah tugas...&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onClick&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;addTodo&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Tambah&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;todos&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; ? (&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;Tidak ada tugas&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) : (&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;todos&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;todo&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;todo&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;todo&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;TodoApp&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3695&quot; data-start=&quot;3584&quot;&gt;Di contoh ini kita sudah menggunakan:&lt;br /&gt;
✔ State&lt;br data-end=&quot;3632&quot; data-start=&quot;3629&quot; /&gt;
✔ List Rendering&lt;br data-end=&quot;3651&quot; data-start=&quot;3648&quot; /&gt;
✔ Conditional Rendering&lt;br data-end=&quot;3677&quot; data-start=&quot;3674&quot; /&gt;
✔ Input handling&lt;/p&gt;
&lt;hr data-end=&quot;3700&quot; data-start=&quot;3697&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Pada artikel ini kamu telah mempelajari:&lt;/p&gt;
&lt;ul data-end=&quot;3929&quot; data-start=&quot;3761&quot;&gt;
&lt;li data-end=&quot;3806&quot; data-start=&quot;3761&quot;&gt;
&lt;p data-end=&quot;3806&quot; data-start=&quot;3763&quot;&gt;Cara menampilkan elemen berdasarkan kondisi&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3848&quot; data-start=&quot;3807&quot;&gt;
&lt;p data-end=&quot;3848&quot; data-start=&quot;3809&quot;&gt;Cara merender list menggunakan &lt;code data-end=&quot;3848&quot; data-start=&quot;3840&quot;&gt;.map()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3876&quot; data-start=&quot;3849&quot;&gt;
&lt;p data-end=&quot;3876&quot; data-start=&quot;3851&quot;&gt;Pentingnya penggunaan key&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3929&quot; data-start=&quot;3877&quot;&gt;
&lt;p data-end=&quot;3929&quot; data-start=&quot;3879&quot;&gt;Aplikasi sederhana yang menggabungkan semua konsep&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4048&quot; data-start=&quot;3931&quot;&gt;Dengan menguasai dua konsep ini, kamu sudah selangkah lebih dekat untuk membangun aplikasi React yang lebih kompleks. Pada artikel berikutnya kita akan belajar&amp;nbsp;&lt;a href=&quot;/2025/12/belajar-react-5-handling-events.html&quot; target=&quot;_blank&quot;&gt;Handling Events &amp;amp; Controlled Components&lt;/a&gt;&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/1553205636205568049/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-4-conditional-rendering.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1553205636205568049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1553205636205568049'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-4-conditional-rendering.html' title='⭐ Belajar React #4 — Conditional Rendering &amp; List Rendering'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-1975410004524890504</id><published>2025-12-10T13:21:00.005+07:00</published><updated>2025-12-11T09:22:21.259+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Belajar React #3 — Memahami State &amp; Event Handling (React Mulai Hidup!)</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada &lt;a href=&quot;/2025/12/belajar-react-2-instalasi-react-dasar.html&quot; target=&quot;_blank&quot;&gt;artikel sebelumnya &lt;/a&gt;saya sudah belajar membuat project React, memahami JSX, component, dan props. Pada tahap itu, UI masih bersifat &lt;strong&gt;statis&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mulai artikel ini, React akan terasa semakin menarik karena saya mulai belajar bagian penting yang membuat UI menjadi &lt;strong&gt;dinamis&lt;/strong&gt;: &lt;strong&gt;State &amp;amp; Event Handling&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Apa Itu State dalam React?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;State&lt;/strong&gt; adalah data internal yang disimpan oleh sebuah component. Berbeda dengan props yang dikirim dari luar, state dikelola di dalam component dan dapat berubah seiring interaksi.&lt;/p&gt;
&lt;p&gt;Ketika state berubah → React otomatis me-render ulang tampilan terkait.&lt;/p&gt;
&lt;p&gt;React menyediakan hook bernama &lt;strong&gt;useState&lt;/strong&gt; untuk membuat state.&lt;/p&gt;
&lt;p&gt;Contoh dasar:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;import { useState } from &quot;react&quot;;

function Counter() {
  const [count, setCount] = useState(0);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Count: {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;Tambah&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default Counter;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan singkat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;count&lt;/code&gt; → nilai state&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;setCount&lt;/code&gt; → fungsi untuk mengubah state&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;useState(0)&lt;/code&gt; → nilai awal state adalah 0&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ketika tombol diklik, angka akan bertambah.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Event Handling: Membuat UI Bereaksi&lt;/h2&gt;
&lt;p&gt;Event handling adalah cara React merespons aksi pengguna: klik, input, hover, submit, dll.&lt;/p&gt;
&lt;p&gt;React menggunakan sintaks seperti HTML tetapi dengan gaya JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;onClick&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;onChange&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;onSubmit&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contoh sederhana:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&amp;lt;button onClick={handleClick}&amp;gt;Klik Saya&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Event handler adalah fungsi JavaScript biasa.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Studi Kasus Praktikal: Membuat Counter Interaktif&lt;/h2&gt;
&lt;p&gt;Mari praktik membuat component &quot;Counter&quot; untuk memahami konsep dengan jelas.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Langkah 1 — Buat file component&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;src/components/Counter.jsx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Isi file&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;useState&lt;/span&gt; } &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;react&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;Counter&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; [&lt;span style=&quot;color: #4fc1ff;&quot;&gt;value&lt;/span&gt;, &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setValue&lt;/span&gt;] &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;useState&lt;/span&gt;(&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;increment&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setValue&lt;/span&gt;(&lt;span style=&quot;color: #4fc1ff;&quot;&gt;value&lt;/span&gt; &lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;decrement&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setValue&lt;/span&gt;(&lt;span style=&quot;color: #4fc1ff;&quot;&gt;value&lt;/span&gt; &lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Counter&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Nilai: &lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onClick&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;decrement&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;-&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onClick&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;increment&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;+&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;Counter&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Langkah 2 — Panggil di App.jsx&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;Counter&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;./components/Counter&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;App&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Belajar State &amp;amp; Event Handling&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Counter&lt;/span&gt; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;App&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Coba klik tombolnya — angka akan berubah.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgDxNDR6ysMSaKF0TFiHYO8f1eZaTVfUEm0uvQ3NA1hD3WzflkKfHqRkSXbI587K6Hu-NDZqINd089bjlR6TBJnhm6FBTtvhNIjrjGpb06MXdEJ_uGRB4nnoiuNMpYBN36F1Y0ALOW1mk6h1GfAblrneaRzmPAUdDYeC_AKVJBVzi-eAtzwzPyNwdVE9b8z&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;768&quot; data-original-width=&quot;1360&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgDxNDR6ysMSaKF0TFiHYO8f1eZaTVfUEm0uvQ3NA1hD3WzflkKfHqRkSXbI587K6Hu-NDZqINd089bjlR6TBJnhm6FBTtvhNIjrjGpb06MXdEJ_uGRB4nnoiuNMpYBN36F1Y0ALOW1mk6h1GfAblrneaRzmPAUdDYeC_AKVJBVzi-eAtzwzPyNwdVE9b8z=w640-h362&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Studi Kasus Tambahan: Input Form Sederhana&lt;/h2&gt;
&lt;p&gt;State juga digunakan untuk menangani form.&lt;/p&gt;
&lt;p&gt;Buat file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/components/FormName.jsx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isi file:&lt;/p&gt;
&lt;pre&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; { &lt;span style=&quot;color: #9cdcfe;&quot;&gt;useState&lt;/span&gt; } &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;react&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;FormName&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; [&lt;span style=&quot;color: #4fc1ff;&quot;&gt;name&lt;/span&gt;, &lt;span style=&quot;color: #dcdcaa;&quot;&gt;setName&lt;/span&gt;] &lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;useState&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Form Nama&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;input&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Masukkan nama...&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;onChange&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;setName&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Halo, &lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; || &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;FormName&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre&gt;Penjelasan:&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;value={name}&lt;/code&gt; menjadikan input sebagai &lt;strong&gt;controlled component&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;onChange&lt;/code&gt; mengubah state berdasarkan input pengguna&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Kemudian dipanggil di App.jsx seperti ini :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;FormName&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;./components/FormName&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;App&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Belajar State &amp;amp; Event Handling&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;FormName&lt;/span&gt; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;App&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasilnya seperti ini&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjT9qK8KoV7NWnwtZS7I6_jztNUZPTcMhxHeHLj-MqIZjmwxrTeTz3mh5wYzrkx4VyaExCBRGBVamFe1VshoFKhQalNODhim0AqL6L5YJtd9RWX-XLlYoO-xNaRFPrkD7NxOWyg58VZdKpfAASGRKpv8zJbs4Ziopmku6J09Bc-wpyHYcLEMrGY6IPBvZ0a&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;768&quot; data-original-width=&quot;1360&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjT9qK8KoV7NWnwtZS7I6_jztNUZPTcMhxHeHLj-MqIZjmwxrTeTz3mh5wYzrkx4VyaExCBRGBVamFe1VshoFKhQalNODhim0AqL6L5YJtd9RWX-XLlYoO-xNaRFPrkD7NxOWyg58VZdKpfAASGRKpv8zJbs4Ziopmku6J09Bc-wpyHYcLEMrGY6IPBvZ0a=w640-h362&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Kesalahan yang Sering Saya Temui&lt;/h2&gt;
&lt;h3&gt;❌ &lt;strong&gt;State tidak berubah padahal memanggil setState&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Biasanya karena:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;menggunakan variabel state lama tanpa memanggil fungsi updater&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;salah penempatan hook (useState harus di level teratas function)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;❌ &lt;strong&gt;Event tidak berjalan&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Biasanya karena:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lupa menulis &lt;code inline=&quot;&quot;&gt;onClick={}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;salah penulisan nama event (harus camelCase)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;❌ &lt;strong&gt;Error: Invalid hook call&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Terjadi jika:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;memanggil useState bukan di dalam component&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;menggunakan React versi ganda&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Hasil Belajar Hari Ini&lt;/h2&gt;
&lt;p&gt;Di artikel ini saya sudah mempraktikkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apa itu state dan kenapa penting&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cara menggunakan useState&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Event handling (onClick, onChange)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Membuat Counter interaktif&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Membuat input form dinamis&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UI React sekarang tidak hanya tampil, tapi &lt;strong&gt;bereaksi&lt;/strong&gt; terhadap tindakan pengguna.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Artikel Selanjutnya&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/2025/12/belajar-react-4-conditional-rendering.html&quot; target=&quot;_blank&quot;&gt;Belajar React #4 — Conditional Rendering &amp;amp; List Rendering&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Di artikel berikutnya saya akan belajar bagaimana menampilkan daftar data, memetakan array dengan &lt;code inline=&quot;&quot;&gt;.map()&lt;/code&gt;, dan menampilkan UI secara kondisional.&lt;/p&gt;
&lt;p&gt;Sampai jumpa di artikel selanjutnya! 🚀&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/1975410004524890504/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-3-memahami-state-event.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1975410004524890504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1975410004524890504'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-3-memahami-state-event.html' title='Belajar React #3 — Memahami State &amp; Event Handling (React Mulai Hidup!)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgDxNDR6ysMSaKF0TFiHYO8f1eZaTVfUEm0uvQ3NA1hD3WzflkKfHqRkSXbI587K6Hu-NDZqINd089bjlR6TBJnhm6FBTtvhNIjrjGpb06MXdEJ_uGRB4nnoiuNMpYBN36F1Y0ALOW1mk6h1GfAblrneaRzmPAUdDYeC_AKVJBVzi-eAtzwzPyNwdVE9b8z=s72-w640-h362-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-712620710840430103</id><published>2025-12-10T11:15:00.007+07:00</published><updated>2025-12-11T09:23:38.834+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Belajar React #2 — Instalasi React + Dasar JSX, Component, dan Props (Praktikal)</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada artikel ini saya langsung memadukan dua hal penting dalam belajar React:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setup project React menggunakan Vite&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Belajar konsep fundamental React: JSX, Component, dan Props&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tujuannya sederhana: &lt;em&gt;belajar konsep sambil langsung praktik&lt;/em&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Instalasi React Menggunakan Vite&lt;/h2&gt;
&lt;p&gt;Vite adalah tool modern dan sangat cepat untuk membuat project React. Langkah-langkahnya:&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1) Persiapan Awal&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Pastikan Node.js sudah terinstal. Periksa dengan perintah:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node -v&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;p data-end=&quot;1022&quot; data-start=&quot;932&quot;&gt;Pastikan versi Node 20.19.x atau lebih baru. Jika belum ada atau masih versi lama silakan download Node.js terbaru (LTS) di website resmi: &lt;a class=&quot;decorated-link&quot; data-end=&quot;999&quot; data-start=&quot;981&quot; href=&quot;https://nodejs.org/&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;https://nodejs.org&lt;/a&gt;&amp;nbsp;Atau pilih versi:&lt;/p&gt;
&lt;ul data-end=&quot;1076&quot; data-start=&quot;1026&quot;&gt;
&lt;li data-end=&quot;1056&quot; data-start=&quot;1026&quot;&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;1028&quot;&gt;Node 20.19.x atau lebih baru&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1076&quot; data-start=&quot;1060&quot;&gt;
&lt;p data-end=&quot;1076&quot; data-start=&quot;1062&quot;&gt;Atau Node 22.x&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2) Membuat Project Baru&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Jalankan perintah berikut di terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm create vite@latest react-belajar --template react
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3) Masuk ke folder project &amp;amp; install dependencies&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cd react-belajar
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4) Jalankan project&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jika berhasil, Anda akan melihat halaman React default di browser.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Memahami JSX (Dengan Contoh Langsung)&lt;/h2&gt;
&lt;p&gt;JSX adalah cara menulis HTML di dalam JavaScript. React menggunakan JSX untuk membuat UI yang dinamis.&lt;/p&gt;
&lt;p&gt;Contoh dasar komponen React menggunakan JSX:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;function Hello() {
  return (
    &amp;lt;h1&amp;gt;Hello React!&amp;lt;/h1&amp;gt;
  );
}

export default Hello;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JSX memungkinkan kita mengembalikan struktur UI seperti HTML, tapi dengan kekuatan JavaScript.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Membuat Component Pertama Kita&lt;/h2&gt;
&lt;p&gt;Di React, &lt;strong&gt;component&lt;/strong&gt; adalah potongan UI yang dapat digunakan kembali.&lt;/p&gt;
&lt;p&gt;Buat file baru:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/components/Greeting.jsx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isi file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;function Greeting() {
  return &amp;lt;p&amp;gt;Selamat datang di perjalanan belajar React saya!&amp;lt;/p&amp;gt;;
}

export default Greeting;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lalu tampilkan di &lt;code inline=&quot;&quot;&gt;App.jsx&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;import Greeting from &quot;./components/Greeting&quot;;

function App() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Belajar React&amp;lt;/h1&amp;gt;
      &amp;lt;Greeting /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jika muncul teksnya, berarti komponen pertama Anda berhasil tampil.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhpGZEDA424yTw4N9ji4XOcgCWmncXNhTwh7Qgxk_Im3sVDWBUFOWA-q3bwSrYNCX0FzHDNyJOtjC100f59USJUNDEYYOZoG3Ol8DRbX9nihQrkn-crBlQxzkeqPDcjRgmDNvB5Si8NR1DOVzC-iz0tVJHojZdBkyuTOabaLdozAMKaTqaGTBA3Pd9KYGkq&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;768&quot; data-original-width=&quot;1360&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhpGZEDA424yTw4N9ji4XOcgCWmncXNhTwh7Qgxk_Im3sVDWBUFOWA-q3bwSrYNCX0FzHDNyJOtjC100f59USJUNDEYYOZoG3Ol8DRbX9nihQrkn-crBlQxzkeqPDcjRgmDNvB5Si8NR1DOVzC-iz0tVJHojZdBkyuTOabaLdozAMKaTqaGTBA3Pd9KYGkq=w640-h362&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Mengenal Props (Data yang Dikirim ke Component)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Props&lt;/strong&gt; adalah cara mengirim data dari satu component ke component lainnya.&lt;/p&gt;
&lt;p&gt;Buat component baru:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/components/UserCard.jsx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isi file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;UserCard&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;props&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Nama: &lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Umur: &lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;UserCard&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Panggil component ini dengan mengirim props:&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;UserCard&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;./components/UserCard&quot;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;App&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Contoh Props&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;UserCard&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Bagus Prasojo&quot;&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;28&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: grey;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;export&lt;/span&gt; &lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;App&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;Props membuat UI Anda dinamis dan fleksibel.&lt;/pre&gt;&lt;pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhzEa6BEqA-b3CAuPu1J2RWVG7C7V72JwDuBm7XUL1ax_qDJVtKzYdxUkD3iiVxu4XaUVVqMMuOas7yNoS6KLpCVVHf2T_XOcXpzbE4XORXLgxorZR_kpCPZ8jW6YdbaiAyVdhsg5pLnRpm3kPkLoFx45Y0YKxcqCpGd5IoFUzOgbtiO8C6gtXmgaRbyrZs&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;768&quot; data-original-width=&quot;1360&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhzEa6BEqA-b3CAuPu1J2RWVG7C7V72JwDuBm7XUL1ax_qDJVtKzYdxUkD3iiVxu4XaUVVqMMuOas7yNoS6KLpCVVHf2T_XOcXpzbE4XORXLgxorZR_kpCPZ8jW6YdbaiAyVdhsg5pLnRpm3kPkLoFx45Y0YKxcqCpGd5IoFUzOgbtiO8C6gtXmgaRbyrZs=w640-h362&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Kesalahan Umum Pemula (Yang Saya Alami Juga)&lt;/h2&gt;
&lt;p&gt;Beberapa error yang mungkin muncul:&lt;/p&gt;
&lt;h3&gt;❌ &lt;em&gt;&quot;Unexpected token &amp;lt;&quot;&lt;/em&gt; atau blank page&lt;/h3&gt;
&lt;p&gt;Biasanya karena JSX tidak diproses, pastikan file berekstensi &lt;code inline=&quot;&quot;&gt;.jsx&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;❌ &lt;em&gt;&quot;Component is not defined&quot;&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Biasanya karena lupa melakukan &lt;code inline=&quot;&quot;&gt;import&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;❌ Salah penamaan file (huruf kapital wajib)&lt;/h3&gt;
&lt;p&gt;React mengharuskan nama component diawali huruf besar: &lt;code inline=&quot;&quot;&gt;UserCard&lt;/code&gt;, bukan &lt;code inline=&quot;&quot;&gt;usercard&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Hasil Belajar Hari Ini&lt;/h2&gt;
&lt;p&gt;Di artikel ini saya belajar sekaligus mempraktikkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Membuat project React dengan Vite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Memahami apa itu JSX&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Membuat component sederhana&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menggunakan props untuk mengirim data ke component&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dengan bekal ini, saya sudah siap masuk ke React yang lebih dinamis: &lt;strong&gt;State &amp;amp; Event Handling&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Artikel Selanjutnya&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/2025/12/belajar-react-3-memahami-state-event.html&quot; target=&quot;_blank&quot;&gt;Belajar React #3 — State &amp;amp; Event Handling (Mulai Interaktif!)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sampai ketemu di artikel berikutnya 🙌&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/712620710840430103/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-2-instalasi-react-dasar.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/712620710840430103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/712620710840430103'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-2-instalasi-react-dasar.html' title='Belajar React #2 — Instalasi React + Dasar JSX, Component, dan Props (Praktikal)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhpGZEDA424yTw4N9ji4XOcgCWmncXNhTwh7Qgxk_Im3sVDWBUFOWA-q3bwSrYNCX0FzHDNyJOtjC100f59USJUNDEYYOZoG3Ol8DRbX9nihQrkn-crBlQxzkeqPDcjRgmDNvB5Si8NR1DOVzC-iz0tVJHojZdBkyuTOabaLdozAMKaTqaGTBA3Pd9KYGkq=s72-w640-h362-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-2052432803374602383</id><published>2025-12-05T10:02:00.003+07:00</published><updated>2025-12-10T11:44:47.645+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Belajar React #1 — Memulai Perjalanan Belajar Saya</title><content type='html'>&lt;h2&gt;Kenapa Saya Belajar React&lt;/h2&gt;&lt;p&gt;React adalah salah satu library JavaScript paling populer untuk membangun antarmuka pengguna modern. Banyak perusahaan besar menggunakannya, komunitasnya kuat, dokumentasinya lengkap, dan peluang kerja di bidang Front-End yang menggunakan React sangat luas.&lt;/p&gt;&lt;p&gt;Saya memutuskan untuk belajar React dari dasar, benar-benar dari level pemula, dengan tujuan:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;Memahami konsep fundamental React, bukan hanya menghafal syntax.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Membangun aplikasi nyata menggunakan React.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mendokumentasikan proses belajar saya agar bermanfaat bagi orang lain.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Menjadikan tulisan ini sebagai arsip pribadi untuk bahan evaluasi dan pengingat.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Cara Saya Belajar React&lt;/h2&gt;&lt;p&gt;Saya mengikuti pendekatan belajar bertahap, berbasis praktik, dan berorientasi pada pemahaman konsep. Setiap topik yang saya pelajari akan saya dokumentasikan di blog ini lengkap dengan contoh kode, catatan kesalahan, dan hal-hal yang saya pelajari.&lt;/p&gt;&lt;p&gt;Setiap artikel akan terdiri dari:&lt;/p&gt;&lt;ol data-spread=&quot;false&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;p&gt;Topik yang dipelajari&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kenapa topik tersebut penting&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pemahaman konsep dengan bahasa sederhana&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Contoh kode atau implementasi kecil&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Masalah yang saya temui dan solusinya&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hasil belajar di akhir artikel&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Rencana Belajar React&lt;/h2&gt;&lt;p&gt;Berikut roadmap belajar React yang saya buat untuk diri saya sendiri:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Minggu&lt;/th&gt;&lt;th&gt;Materi Belajar&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Apa itu React? Kenapa React? Instalasi &amp;amp; Setup Project dengan Vite&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;JSX, Components, Props&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;State &amp;amp; Event Handling&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;List Rendering &amp;amp; Conditional Rendering&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Hooks dasar (useState, useEffect)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Form &amp;amp; Controlled Components&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Routing dengan React Router&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Context API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Fetch API &amp;amp; Axios&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Deploy ke Vercel/Netlify&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Target Output dari Proses Belajar Ini&lt;/h2&gt;&lt;p&gt;Di akhir pembelajaran ini, saya menargetkan untuk:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;Membuat minimal satu aplikasi React dari awal sampai selesai&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Memahami cara kerja React tanpa bergantung pada tutorial YouTube&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mendapatkan dokumentasi belajar yang bisa dibagikan ke developer lain&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Memiliki portfolio nyata di GitHub dan blog&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Komitmen Saya&lt;/h2&gt;&lt;p&gt;Saya akan mempublikasikan satu artikel setiap minggu. Saya percaya bahwa konsistensi lebih penting daripada kecepatan—yang penting terus belajar dan terus bergerak.&lt;/p&gt;&lt;p&gt;Jika kamu mengikuti seri ini atau ingin belajar bersama, silakan tinggalkan komentar atau pertanyaan. Kita bisa berkembang bersama.&lt;/p&gt;&lt;p&gt;Sampai jumpa di artikel selanjutnya:
&lt;strong&gt;&lt;a href=&quot;/2025/12/belajar-react-2-instalasi-react-dasar.html&quot;&gt;Belajar React #2 — Mengenal JSX, Component, dan Props&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Terima kasih sudah membaca 🙏&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Disclaimer: Saya masih pemula. Jika ada kesalahan atau penjelasan yang kurang tepat, saya sangat terbuka untuk masukan.&lt;/em&gt;&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/2052432803374602383/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-1-memulai-perjalanan.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/2052432803374602383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/2052432803374602383'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/12/belajar-react-1-memulai-perjalanan.html' title='Belajar React #1 — Memulai Perjalanan Belajar Saya'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-1366920806401727624</id><published>2025-12-02T19:41:00.008+07:00</published><updated>2025-12-02T19:51:02.741+07:00</updated><title type='text'>Software Requirements Specification (SRS) Enterprise Resource Planning</title><content type='html'>&lt;h1 data-end=&quot;329&quot; data-start=&quot;313&quot; style=&quot;text-align: center;&quot;&gt;Software Requirements Specification (SRS)&lt;/h1&gt;
&lt;h2 data-end=&quot;329&quot; data-start=&quot;313&quot; style=&quot;text-align: center;&quot;&gt;Modul Akuntansi, Sales, dan Purchase Order&lt;/h2&gt;
&lt;h1 data-end=&quot;329&quot; data-start=&quot;313&quot;&gt;&lt;br /&gt;&lt;/h1&gt;&lt;h1 data-end=&quot;329&quot; data-start=&quot;313&quot;&gt;1. Pendahuluan&lt;/h1&gt;
&lt;h2 data-end=&quot;352&quot; data-start=&quot;331&quot;&gt;1.1 Tujuan Dokumen&lt;/h2&gt;
&lt;p data-end=&quot;424&quot; data-start=&quot;354&quot;&gt;Dokumen Software Requirements Specification (SRS) ini bertujuan untuk:&lt;/p&gt;
&lt;ul data-end=&quot;779&quot; data-start=&quot;426&quot;&gt;
&lt;li data-end=&quot;582&quot; data-start=&quot;426&quot;&gt;
&lt;p data-end=&quot;582&quot; data-start=&quot;428&quot;&gt;Mendefinisikan kebutuhan fungsional dan non-fungsional aplikasi web internal perusahaan yang mengacu pada konsep Odoo (accounting, sales, purchase order).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;712&quot; data-start=&quot;583&quot;&gt;
&lt;p data-end=&quot;712&quot; data-start=&quot;585&quot;&gt;Menjadi acuan bagi tim pengembang, analis sistem, QA, dan stakeholder terkait dalam proses desain, implementasi, dan pengujian.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;779&quot; data-start=&quot;713&quot;&gt;
&lt;p data-end=&quot;779&quot; data-start=&quot;715&quot;&gt;Menjadi dasar untuk pengukuran keberhasilan implementasi sistem.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;808&quot; data-start=&quot;781&quot;&gt;1.2 Ruang Lingkup Sistem&lt;/h2&gt;
&lt;p data-end=&quot;883&quot; data-start=&quot;810&quot;&gt;Aplikasi ini adalah sistem ERP sederhana berbasis web dengan modul utama:&lt;/p&gt;
&lt;ol data-end=&quot;979&quot; data-start=&quot;885&quot;&gt;
&lt;li data-end=&quot;911&quot; data-start=&quot;885&quot;&gt;
&lt;p data-end=&quot;911&quot; data-start=&quot;888&quot;&gt;&lt;strong data-end=&quot;909&quot; data-start=&quot;888&quot;&gt;Sales (Penjualan)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;947&quot; data-start=&quot;912&quot;&gt;
&lt;p data-end=&quot;947&quot; data-start=&quot;915&quot;&gt;&lt;strong data-end=&quot;945&quot; data-start=&quot;915&quot;&gt;Purchase Order (Pembelian)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;979&quot; data-start=&quot;948&quot;&gt;
&lt;p data-end=&quot;979&quot; data-start=&quot;951&quot;&gt;&lt;strong data-end=&quot;977&quot; data-start=&quot;951&quot;&gt;Accounting (Akuntansi)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1001&quot; data-start=&quot;981&quot;&gt;Karakteristik utama:&lt;/p&gt;
&lt;ul data-end=&quot;1353&quot; data-start=&quot;1003&quot;&gt;
&lt;li data-end=&quot;1103&quot; data-start=&quot;1003&quot;&gt;
&lt;p data-end=&quot;1103&quot; data-start=&quot;1005&quot;&gt;Aplikasi monolith, dibangun dengan &lt;strong data-end=&quot;1050&quot; data-start=&quot;1040&quot;&gt;Django&lt;/strong&gt; (backend &amp;amp; frontend) dan &lt;strong data-end=&quot;1085&quot; data-start=&quot;1076&quot;&gt;MySQL&lt;/strong&gt; sebagai database.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1140&quot; data-start=&quot;1104&quot;&gt;
&lt;p data-end=&quot;1140&quot; data-start=&quot;1106&quot;&gt;Styling menggunakan &lt;strong data-end=&quot;1139&quot; data-start=&quot;1126&quot;&gt;Bootstrap&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1234&quot; data-start=&quot;1141&quot;&gt;
&lt;p data-end=&quot;1154&quot; data-start=&quot;1143&quot;&gt;Fokus pada:&lt;/p&gt;
&lt;ul data-end=&quot;1234&quot; data-start=&quot;1157&quot;&gt;
&lt;li data-end=&quot;1196&quot; data-start=&quot;1157&quot;&gt;
&lt;p data-end=&quot;1196&quot; data-start=&quot;1159&quot;&gt;&lt;strong data-end=&quot;1195&quot; data-start=&quot;1159&quot;&gt;Kemudahan penggunaan (usability)&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1234&quot; data-start=&quot;1199&quot;&gt;
&lt;p data-end=&quot;1234&quot; data-start=&quot;1201&quot;&gt;&lt;strong data-end=&quot;1233&quot; data-start=&quot;1201&quot;&gt;Keamanan aplikasi (security)&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1353&quot; data-start=&quot;1235&quot;&gt;
&lt;p data-end=&quot;1353&quot; data-start=&quot;1237&quot;&gt;Digunakan secara internal oleh perusahaan untuk mengelola proses bisnis terkait penjualan, pembelian, dan akuntansi.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1394&quot; data-start=&quot;1355&quot;&gt;1.3 Definisi, Istilah, dan Singkatan&lt;/h2&gt;
&lt;ul data-end=&quot;1855&quot; data-start=&quot;1396&quot;&gt;
&lt;li data-end=&quot;1452&quot; data-start=&quot;1396&quot;&gt;
&lt;p data-end=&quot;1452&quot; data-start=&quot;1398&quot;&gt;&lt;strong data-end=&quot;1418&quot; data-start=&quot;1398&quot;&gt;Sales Order (SO)&lt;/strong&gt;: Dokumen pemesanan dari customer.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1529&quot; data-start=&quot;1453&quot;&gt;
&lt;p data-end=&quot;1529&quot; data-start=&quot;1455&quot;&gt;&lt;strong data-end=&quot;1478&quot; data-start=&quot;1455&quot;&gt;Purchase Order (PO)&lt;/strong&gt;: Dokumen pemesanan barang/jasa ke vendor/supplier.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1575&quot; data-start=&quot;1530&quot;&gt;
&lt;p data-end=&quot;1575&quot; data-start=&quot;1532&quot;&gt;&lt;strong data-end=&quot;1553&quot; data-start=&quot;1532&quot;&gt;Invoice Penjualan&lt;/strong&gt;: Tagihan ke customer.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1576&quot;&gt;
&lt;p data-end=&quot;1621&quot; data-start=&quot;1578&quot;&gt;&lt;strong data-end=&quot;1599&quot; data-start=&quot;1578&quot;&gt;Invoice Pembelian&lt;/strong&gt;: Tagihan dari vendor.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1693&quot; data-start=&quot;1622&quot;&gt;
&lt;p data-end=&quot;1693&quot; data-start=&quot;1624&quot;&gt;&lt;strong data-end=&quot;1651&quot; data-start=&quot;1624&quot;&gt;Chart of Accounts (CoA)&lt;/strong&gt;: Daftar akun-akun dalam sistem akuntansi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1735&quot; data-start=&quot;1694&quot;&gt;
&lt;p data-end=&quot;1735&quot; data-start=&quot;1696&quot;&gt;&lt;strong data-end=&quot;1704&quot; data-start=&quot;1696&quot;&gt;User&lt;/strong&gt;: Pengguna yang terautentikasi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1814&quot; data-start=&quot;1736&quot;&gt;
&lt;p data-end=&quot;1814&quot; data-start=&quot;1738&quot;&gt;&lt;strong data-end=&quot;1746&quot; data-start=&quot;1738&quot;&gt;Role&lt;/strong&gt;: Peran pengguna (Admin, Finance, Sales, Purchasing, Auditor, dll.).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1855&quot; data-start=&quot;1815&quot;&gt;
&lt;p data-end=&quot;1855&quot; data-start=&quot;1817&quot;&gt;&lt;strong data-end=&quot;1824&quot; data-start=&quot;1817&quot;&gt;ERP&lt;/strong&gt;: Enterprise Resource Planning.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1873&quot; data-start=&quot;1857&quot;&gt;1.4 Referensi&lt;/h2&gt;
&lt;ul data-end=&quot;2115&quot; data-start=&quot;1875&quot;&gt;
&lt;li data-end=&quot;1992&quot; data-start=&quot;1875&quot;&gt;
&lt;p data-end=&quot;1992&quot; data-start=&quot;1877&quot;&gt;Konsep fungsional mengacu pada modul dasar &lt;strong data-end=&quot;1928&quot; data-start=&quot;1920&quot;&gt;Odoo&lt;/strong&gt; (Sales, Purchase, Accounting) sebagai inspirasi alur dan fitur.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2036&quot; data-start=&quot;1993&quot;&gt;
&lt;p data-end=&quot;2036&quot; data-start=&quot;1995&quot;&gt;Standar keamanan web umum (OWASP Top 10).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2115&quot; data-start=&quot;2037&quot;&gt;
&lt;p data-end=&quot;2115&quot; data-start=&quot;2039&quot;&gt;Konsep dasar akuntansi: double entry, debit/kredit, jurnal umum, buku besar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2120&quot; data-start=&quot;2117&quot; /&gt;
&lt;h1 data-end=&quot;2147&quot; data-start=&quot;2122&quot;&gt;2. Gambaran Umum Sistem&lt;/h1&gt;
&lt;h2 data-end=&quot;2173&quot; data-start=&quot;2149&quot;&gt;2.1 Perspektif Produk&lt;/h2&gt;
&lt;p data-end=&quot;2249&quot; data-start=&quot;2175&quot;&gt;Sistem ini adalah aplikasi web internal berbasis browser, bekerja sebagai:&lt;/p&gt;
&lt;ul data-end=&quot;2628&quot; data-start=&quot;2251&quot;&gt;
&lt;li data-end=&quot;2418&quot; data-start=&quot;2251&quot;&gt;
&lt;p data-end=&quot;2275&quot; data-start=&quot;2253&quot;&gt;Portal terpusat untuk:&lt;/p&gt;
&lt;ul data-end=&quot;2418&quot; data-start=&quot;2278&quot;&gt;
&lt;li data-end=&quot;2314&quot; data-start=&quot;2278&quot;&gt;
&lt;p data-end=&quot;2314&quot; data-start=&quot;2280&quot;&gt;Membuat dan mengelola Sales Order.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2344&quot; data-start=&quot;2317&quot;&gt;
&lt;p data-end=&quot;2344&quot; data-start=&quot;2319&quot;&gt;Mengelola Purchase Order.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2418&quot; data-start=&quot;2347&quot;&gt;
&lt;p data-end=&quot;2418&quot; data-start=&quot;2349&quot;&gt;Mencatat transaksi keuangan dan menghasilkan laporan akuntansi dasar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2419&quot;&gt;
&lt;p data-end=&quot;2482&quot; data-start=&quot;2421&quot;&gt;Sistem monolith dengan arsitektur web biasa (Django MVC/MVT):&lt;/p&gt;
&lt;ul data-end=&quot;2628&quot; data-start=&quot;2485&quot;&gt;
&lt;li data-end=&quot;2539&quot; data-start=&quot;2485&quot;&gt;
&lt;p data-end=&quot;2539&quot; data-start=&quot;2487&quot;&gt;&lt;strong data-end=&quot;2509&quot; data-start=&quot;2487&quot;&gt;Presentation Layer&lt;/strong&gt;: Template Django + Bootstrap.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2601&quot; data-start=&quot;2542&quot;&gt;
&lt;p data-end=&quot;2601&quot; data-start=&quot;2544&quot;&gt;&lt;strong data-end=&quot;2568&quot; data-start=&quot;2544&quot;&gt;Business Logic Layer&lt;/strong&gt;: Django views, services, models.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2604&quot;&gt;
&lt;p data-end=&quot;2628&quot; data-start=&quot;2606&quot;&gt;&lt;strong data-end=&quot;2620&quot; data-start=&quot;2606&quot;&gt;Data Layer&lt;/strong&gt;: MySQL.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2668&quot; data-start=&quot;2630&quot;&gt;2.2 Fungsi Utama Sistem (Ringkasan)&lt;/h2&gt;
&lt;ol data-end=&quot;3573&quot; data-start=&quot;2670&quot;&gt;
&lt;li data-end=&quot;2743&quot; data-start=&quot;2670&quot;&gt;
&lt;p data-end=&quot;2700&quot; data-start=&quot;2673&quot;&gt;&lt;strong data-end=&quot;2700&quot; data-start=&quot;2673&quot;&gt;Autentikasi &amp;amp; Otorisasi&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;2743&quot; data-start=&quot;2704&quot;&gt;
&lt;li data-end=&quot;2743&quot; data-start=&quot;2704&quot;&gt;
&lt;p data-end=&quot;2743&quot; data-start=&quot;2706&quot;&gt;Login, logout, manajemen user &amp;amp; role.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2834&quot; data-start=&quot;2744&quot;&gt;
&lt;p data-end=&quot;2760&quot; data-start=&quot;2747&quot;&gt;&lt;strong data-end=&quot;2760&quot; data-start=&quot;2747&quot;&gt;Dashboard&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;2834&quot; data-start=&quot;2764&quot;&gt;
&lt;li data-end=&quot;2834&quot; data-start=&quot;2764&quot;&gt;
&lt;p data-end=&quot;2834&quot; data-start=&quot;2766&quot;&gt;Ringkasan penjualan, pembelian, piutang, hutang, cashflow sederhana.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2992&quot; data-start=&quot;2835&quot;&gt;
&lt;p data-end=&quot;2853&quot; data-start=&quot;2838&quot;&gt;&lt;strong data-end=&quot;2853&quot; data-start=&quot;2838&quot;&gt;Modul Sales&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;2992&quot; data-start=&quot;2857&quot;&gt;
&lt;li data-end=&quot;2884&quot; data-start=&quot;2857&quot;&gt;
&lt;p data-end=&quot;2884&quot; data-start=&quot;2859&quot;&gt;Master pelanggan, produk.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2992&quot; data-start=&quot;2888&quot;&gt;
&lt;p data-end=&quot;2992&quot; data-start=&quot;2890&quot;&gt;Pembuatan penawaran (quotation) → konversi ke Sales Order → pengiriman (opsional) → invoice penjualan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3153&quot; data-start=&quot;2993&quot;&gt;
&lt;p data-end=&quot;3014&quot; data-start=&quot;2996&quot;&gt;&lt;strong data-end=&quot;3014&quot; data-start=&quot;2996&quot;&gt;Modul Purchase&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3153&quot; data-start=&quot;3018&quot;&gt;
&lt;li data-end=&quot;3042&quot; data-start=&quot;3018&quot;&gt;
&lt;p data-end=&quot;3042&quot; data-start=&quot;3020&quot;&gt;Master vendor, produk.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3153&quot; data-start=&quot;3046&quot;&gt;
&lt;p data-end=&quot;3153&quot; data-start=&quot;3048&quot;&gt;Purchase Requisition (opsional) → Purchase Order → penerimaan barang (goods receipt) → invoice pembelian.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3328&quot; data-start=&quot;3154&quot;&gt;
&lt;p data-end=&quot;3177&quot; data-start=&quot;3157&quot;&gt;&lt;strong data-end=&quot;3177&quot; data-start=&quot;3157&quot;&gt;Modul Accounting&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3328&quot; data-start=&quot;3181&quot;&gt;
&lt;li data-end=&quot;3201&quot; data-start=&quot;3181&quot;&gt;
&lt;p data-end=&quot;3201&quot; data-start=&quot;3183&quot;&gt;Chart of Accounts.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3219&quot; data-start=&quot;3205&quot;&gt;
&lt;p data-end=&quot;3219&quot; data-start=&quot;3207&quot;&gt;Jurnal umum.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3270&quot; data-start=&quot;3223&quot;&gt;
&lt;p data-end=&quot;3270&quot; data-start=&quot;3225&quot;&gt;Posting otomatis dari modul Sales &amp;amp; Purchase.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3328&quot; data-start=&quot;3274&quot;&gt;
&lt;p data-end=&quot;3328&quot; data-start=&quot;3276&quot;&gt;Buku besar, neraca saldo, laporan laba rugi, neraca.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3427&quot; data-start=&quot;3329&quot;&gt;
&lt;p data-end=&quot;3363&quot; data-start=&quot;3332&quot;&gt;&lt;strong data-end=&quot;3363&quot; data-start=&quot;3332&quot;&gt;Audit Trail &amp;amp; Log Aktivitas&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3427&quot; data-start=&quot;3367&quot;&gt;
&lt;li data-end=&quot;3427&quot; data-start=&quot;3367&quot;&gt;
&lt;p data-end=&quot;3427&quot; data-start=&quot;3369&quot;&gt;Melacak perubahan data (create, update, delete) oleh user.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3573&quot; data-start=&quot;3428&quot;&gt;
&lt;p data-end=&quot;3448&quot; data-start=&quot;3431&quot;&gt;&lt;strong data-end=&quot;3448&quot; data-start=&quot;3431&quot;&gt;Keamanan Data&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3573&quot; data-start=&quot;3452&quot;&gt;
&lt;li data-end=&quot;3487&quot; data-start=&quot;3452&quot;&gt;
&lt;p data-end=&quot;3487&quot; data-start=&quot;3454&quot;&gt;Role-based access control (RBAC).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3573&quot; data-start=&quot;3491&quot;&gt;
&lt;p data-end=&quot;3573&quot; data-start=&quot;3493&quot;&gt;Validasi input, proteksi terhadap serangan umum (SQL Injection, XSS, CSRF, dll).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;3595&quot; data-start=&quot;3575&quot;&gt;2.3 Tipe Pengguna&lt;/h2&gt;
&lt;ul data-end=&quot;4101&quot; data-start=&quot;3597&quot;&gt;
&lt;li data-end=&quot;3664&quot; data-start=&quot;3597&quot;&gt;
&lt;p data-end=&quot;3623&quot; data-start=&quot;3599&quot;&gt;&lt;strong data-end=&quot;3623&quot; data-start=&quot;3599&quot;&gt;Administrator Sistem&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3664&quot; data-start=&quot;3626&quot;&gt;
&lt;li data-end=&quot;3664&quot; data-start=&quot;3626&quot;&gt;
&lt;p data-end=&quot;3664&quot; data-start=&quot;3628&quot;&gt;Kelola user, role, parameter sistem.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3749&quot; data-start=&quot;3665&quot;&gt;
&lt;p data-end=&quot;3681&quot; data-start=&quot;3667&quot;&gt;&lt;strong data-end=&quot;3681&quot; data-start=&quot;3667&quot;&gt;User Sales&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3749&quot; data-start=&quot;3684&quot;&gt;
&lt;li data-end=&quot;3749&quot; data-start=&quot;3684&quot;&gt;
&lt;p data-end=&quot;3749&quot; data-start=&quot;3686&quot;&gt;Mengelola pelanggan, quotation, SO, invoice penjualan terbatas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3859&quot; data-start=&quot;3750&quot;&gt;
&lt;p data-end=&quot;3771&quot; data-start=&quot;3752&quot;&gt;&lt;strong data-end=&quot;3771&quot; data-start=&quot;3752&quot;&gt;User Purchasing&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3859&quot; data-start=&quot;3774&quot;&gt;
&lt;li data-end=&quot;3859&quot; data-start=&quot;3774&quot;&gt;
&lt;p data-end=&quot;3859&quot; data-start=&quot;3776&quot;&gt;Mengelola vendor, PR (bila ada), PO, penerimaan barang, invoice pembelian terbatas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3948&quot; data-start=&quot;3860&quot;&gt;
&lt;p data-end=&quot;3889&quot; data-start=&quot;3862&quot;&gt;&lt;strong data-end=&quot;3889&quot; data-start=&quot;3862&quot;&gt;User Finance/Accounting&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3948&quot; data-start=&quot;3892&quot;&gt;
&lt;li data-end=&quot;3948&quot; data-start=&quot;3892&quot;&gt;
&lt;p data-end=&quot;3948&quot; data-start=&quot;3894&quot;&gt;Mengelola CoA, jurnal, rekonsiliasi, laporan keuangan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4029&quot; data-start=&quot;3949&quot;&gt;
&lt;p data-end=&quot;3983&quot; data-start=&quot;3951&quot;&gt;&lt;strong data-end=&quot;3983&quot; data-start=&quot;3951&quot;&gt;Manajemen (Director/Manager)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;4029&quot; data-start=&quot;3986&quot;&gt;
&lt;li data-end=&quot;4029&quot; data-start=&quot;3986&quot;&gt;
&lt;p data-end=&quot;4029&quot; data-start=&quot;3988&quot;&gt;Akses read-only ke laporan dan dashboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4101&quot; data-start=&quot;4030&quot;&gt;
&lt;p data-end=&quot;4052&quot; data-start=&quot;4032&quot;&gt;&lt;strong data-end=&quot;4052&quot; data-start=&quot;4032&quot;&gt;Auditor Internal&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;4101&quot; data-start=&quot;4055&quot;&gt;
&lt;li data-end=&quot;4101&quot; data-start=&quot;4055&quot;&gt;
&lt;p data-end=&quot;4101&quot; data-start=&quot;4057&quot;&gt;Akses read-only ke log dan laporan tertentu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;4117&quot; data-start=&quot;4103&quot;&gt;2.4 Batasan&lt;/h2&gt;
&lt;ul data-end=&quot;4385&quot; data-start=&quot;4119&quot;&gt;
&lt;li data-end=&quot;4165&quot; data-start=&quot;4119&quot;&gt;
&lt;p data-end=&quot;4165&quot; data-start=&quot;4121&quot;&gt;Sistem hanya diakses melalui browser modern.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4219&quot; data-start=&quot;4166&quot;&gt;
&lt;p data-end=&quot;4219&quot; data-start=&quot;4168&quot;&gt;Tidak ada mobile app khusus (hanya web responsive).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4289&quot; data-start=&quot;4220&quot;&gt;
&lt;p data-end=&quot;4289&quot; data-start=&quot;4222&quot;&gt;Tidak ada API publik ke sistem lain pada fase awal (monolith full).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4385&quot; data-start=&quot;4290&quot;&gt;
&lt;p data-end=&quot;4385&quot; data-start=&quot;4292&quot;&gt;Integrasi dengan sistem eksternal (mis. bank, e-faktur, payroll) tidak termasuk lingkup awal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4390&quot; data-start=&quot;4387&quot; /&gt;
&lt;h1 data-end=&quot;4417&quot; data-start=&quot;4392&quot;&gt;3. Kebutuhan Fungsional&lt;/h1&gt;
&lt;h2 data-end=&quot;4449&quot; data-start=&quot;4419&quot;&gt;3.1 Autentikasi &amp;amp; Otorisasi&lt;/h2&gt;
&lt;h3 data-end=&quot;4478&quot; data-start=&quot;4451&quot;&gt;FR-001 – Login Pengguna&lt;/h3&gt;
&lt;ul data-end=&quot;4730&quot; data-start=&quot;4479&quot;&gt;
&lt;li data-end=&quot;4569&quot; data-start=&quot;4479&quot;&gt;
&lt;p data-end=&quot;4533&quot; data-start=&quot;4481&quot;&gt;Sistem harus menyediakan halaman login dengan input:&lt;/p&gt;
&lt;ul data-end=&quot;4569&quot; data-start=&quot;4536&quot;&gt;
&lt;li data-end=&quot;4555&quot; data-start=&quot;4536&quot;&gt;
&lt;p data-end=&quot;4555&quot; data-start=&quot;4538&quot;&gt;Username / Email.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4569&quot; data-start=&quot;4558&quot;&gt;
&lt;p data-end=&quot;4569&quot; data-start=&quot;4560&quot;&gt;Password.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4616&quot; data-start=&quot;4570&quot;&gt;
&lt;p data-end=&quot;4616&quot; data-start=&quot;4572&quot;&gt;Password diverifikasi dengan hash yang aman.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4730&quot; data-start=&quot;4617&quot;&gt;
&lt;p data-end=&quot;4656&quot; data-start=&quot;4619&quot;&gt;Jika login gagal &amp;gt; X kali, akun bisa:&lt;/p&gt;
&lt;ul data-end=&quot;4730&quot; data-start=&quot;4659&quot;&gt;
&lt;li data-end=&quot;4698&quot; data-start=&quot;4659&quot;&gt;
&lt;p data-end=&quot;4698&quot; data-start=&quot;4661&quot;&gt;Di-lock sementara (configurable) atau&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4730&quot; data-start=&quot;4701&quot;&gt;
&lt;p data-end=&quot;4730&quot; data-start=&quot;4703&quot;&gt;Diminta captcha (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;4760&quot; data-start=&quot;4732&quot;&gt;FR-002 – Logout Pengguna&lt;/h3&gt;
&lt;ul data-end=&quot;4873&quot; data-start=&quot;4761&quot;&gt;
&lt;li data-end=&quot;4812&quot; data-start=&quot;4761&quot;&gt;
&lt;p data-end=&quot;4812&quot; data-start=&quot;4763&quot;&gt;Pengguna dapat melakukan logout secara eksplisit.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4873&quot; data-start=&quot;4813&quot;&gt;
&lt;p data-end=&quot;4873&quot; data-start=&quot;4815&quot;&gt;Session harus berakhir dan cookie terkait dihapus/invalid.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;4906&quot; data-start=&quot;4875&quot;&gt;FR-003 – Manajemen Pengguna&lt;/h3&gt;
&lt;ul data-end=&quot;5195&quot; data-start=&quot;4907&quot;&gt;
&lt;li data-end=&quot;5074&quot; data-start=&quot;4907&quot;&gt;
&lt;p data-end=&quot;4921&quot; data-start=&quot;4909&quot;&gt;Admin dapat:&lt;/p&gt;
&lt;ul data-end=&quot;5074&quot; data-start=&quot;4924&quot;&gt;
&lt;li data-end=&quot;4944&quot; data-start=&quot;4924&quot;&gt;
&lt;p data-end=&quot;4944&quot; data-start=&quot;4926&quot;&gt;Membuat user baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5011&quot; data-start=&quot;4947&quot;&gt;
&lt;p data-end=&quot;5011&quot; data-start=&quot;4949&quot;&gt;Mengubah data user (nama, email, role, status aktif/nonaktif).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5074&quot; data-start=&quot;5014&quot;&gt;
&lt;p data-end=&quot;5074&quot; data-start=&quot;5016&quot;&gt;Reset password user (mengganti dengan password sementara).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5195&quot; data-start=&quot;5075&quot;&gt;
&lt;p data-end=&quot;5108&quot; data-start=&quot;5077&quot;&gt;Sistem harus menyimpan minimal:&lt;/p&gt;
&lt;ul data-end=&quot;5195&quot; data-start=&quot;5111&quot;&gt;
&lt;li data-end=&quot;5126&quot; data-start=&quot;5111&quot;&gt;
&lt;p data-end=&quot;5126&quot; data-start=&quot;5113&quot;&gt;Nama lengkap.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5145&quot; data-start=&quot;5129&quot;&gt;
&lt;p data-end=&quot;5145&quot; data-start=&quot;5131&quot;&gt;Username unik.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5156&quot; data-start=&quot;5148&quot;&gt;
&lt;p data-end=&quot;5156&quot; data-start=&quot;5150&quot;&gt;Email.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5166&quot; data-start=&quot;5159&quot;&gt;
&lt;p data-end=&quot;5166&quot; data-start=&quot;5161&quot;&gt;Role.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5195&quot; data-start=&quot;5169&quot;&gt;
&lt;p data-end=&quot;5195&quot; data-start=&quot;5171&quot;&gt;Status (aktif/nonaktif).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;5237&quot; data-start=&quot;5197&quot;&gt;FR-004 – Manajemen Role &amp;amp; Permission&lt;/h3&gt;
&lt;ul data-end=&quot;5455&quot; data-start=&quot;5238&quot;&gt;
&lt;li data-end=&quot;5405&quot; data-start=&quot;5238&quot;&gt;
&lt;p data-end=&quot;5305&quot; data-start=&quot;5240&quot;&gt;Admin dapat mendefinisikan role dan mengatur permission terhadap:&lt;/p&gt;
&lt;ul data-end=&quot;5405&quot; data-start=&quot;5308&quot;&gt;
&lt;li data-end=&quot;5355&quot; data-start=&quot;5308&quot;&gt;
&lt;p data-end=&quot;5355&quot; data-start=&quot;5310&quot;&gt;Menu (Sales, Purchase, Accounting, Settings).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5405&quot; data-start=&quot;5358&quot;&gt;
&lt;p data-end=&quot;5405&quot; data-start=&quot;5360&quot;&gt;Aksi (create, read, update, delete, approve).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5455&quot; data-start=&quot;5406&quot;&gt;
&lt;p data-end=&quot;5455&quot; data-start=&quot;5408&quot;&gt;Mapping role → permission disimpan di database.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;5485&quot; data-start=&quot;5457&quot;&gt;FR-005 – Password Policy&lt;/h3&gt;
&lt;ul data-end=&quot;5684&quot; data-start=&quot;5486&quot;&gt;
&lt;li data-end=&quot;5525&quot; data-start=&quot;5486&quot;&gt;
&lt;p data-end=&quot;5525&quot; data-start=&quot;5488&quot;&gt;Password minimal X karakter (mis. 8).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5593&quot; data-start=&quot;5526&quot;&gt;
&lt;p data-end=&quot;5593&quot; data-start=&quot;5528&quot;&gt;Kombinasi huruf besar, huruf kecil, angka, dan simbol (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5684&quot; data-start=&quot;5594&quot;&gt;
&lt;p data-end=&quot;5684&quot; data-start=&quot;5596&quot;&gt;Sistem menyediakan fitur ubah password dan forgot password (opsional, jika pakai email).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;5689&quot; data-start=&quot;5686&quot; /&gt;
&lt;h2 data-end=&quot;5707&quot; data-start=&quot;5691&quot;&gt;3.2 Dashboard&lt;/h2&gt;
&lt;h3 data-end=&quot;5736&quot; data-start=&quot;5709&quot;&gt;FR-010 – Dashboard Umum&lt;/h3&gt;
&lt;ul data-end=&quot;6145&quot; data-start=&quot;5737&quot;&gt;
&lt;li data-end=&quot;5992&quot; data-start=&quot;5737&quot;&gt;
&lt;p data-end=&quot;5794&quot; data-start=&quot;5739&quot;&gt;Setelah login, user melihat dashboard yang menampilkan:&lt;/p&gt;
&lt;ul data-end=&quot;5992&quot; data-start=&quot;5797&quot;&gt;
&lt;li data-end=&quot;5840&quot; data-start=&quot;5797&quot;&gt;
&lt;p data-end=&quot;5840&quot; data-start=&quot;5799&quot;&gt;Total SO bulan berjalan (jumlah &amp;amp; nilai).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5869&quot; data-start=&quot;5843&quot;&gt;
&lt;p data-end=&quot;5869&quot; data-start=&quot;5845&quot;&gt;Total PO bulan berjalan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5917&quot; data-start=&quot;5872&quot;&gt;
&lt;p data-end=&quot;5917&quot; data-start=&quot;5874&quot;&gt;Piutang dan Hutang outstanding (ringkasan).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5992&quot; data-start=&quot;5920&quot;&gt;
&lt;p data-end=&quot;5992&quot; data-start=&quot;5922&quot;&gt;Notifikasi dokumen yang menunggu approval (jika user adalah approver).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6145&quot; data-start=&quot;5993&quot;&gt;
&lt;p data-end=&quot;6022&quot; data-start=&quot;5995&quot;&gt;Tampilan menyesuaikan role:&lt;/p&gt;
&lt;ul data-end=&quot;6145&quot; data-start=&quot;6025&quot;&gt;
&lt;li data-end=&quot;6055&quot; data-start=&quot;6025&quot;&gt;
&lt;p data-end=&quot;6055&quot; data-start=&quot;6027&quot;&gt;Sales: fokus pada penjualan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6093&quot; data-start=&quot;6058&quot;&gt;
&lt;p data-end=&quot;6093&quot; data-start=&quot;6060&quot;&gt;Purchasing: fokus pada pembelian.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6145&quot; data-start=&quot;6096&quot;&gt;
&lt;p data-end=&quot;6145&quot; data-start=&quot;6098&quot;&gt;Finance: fokus pada piutang, hutang, cash/bank.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;6150&quot; data-start=&quot;6147&quot; /&gt;
&lt;h2 data-end=&quot;6170&quot; data-start=&quot;6152&quot;&gt;3.3 Modul Sales&lt;/h2&gt;
&lt;h3 data-end=&quot;6199&quot; data-start=&quot;6172&quot;&gt;3.3.1 Master Data Sales&lt;/h3&gt;
&lt;h4 data-end=&quot;6230&quot; data-start=&quot;6201&quot;&gt;FR-020 – Master Customer&lt;/h4&gt;
&lt;ul data-end=&quot;6538&quot; data-start=&quot;6231&quot;&gt;
&lt;li data-end=&quot;6345&quot; data-start=&quot;6231&quot;&gt;
&lt;p data-end=&quot;6258&quot; data-start=&quot;6233&quot;&gt;User Sales / Admin dapat:&lt;/p&gt;
&lt;ul data-end=&quot;6345&quot; data-start=&quot;6261&quot;&gt;
&lt;li data-end=&quot;6289&quot; data-start=&quot;6261&quot;&gt;
&lt;p data-end=&quot;6289&quot; data-start=&quot;6263&quot;&gt;Menambahkan customer baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6317&quot; data-start=&quot;6292&quot;&gt;
&lt;p data-end=&quot;6317&quot; data-start=&quot;6294&quot;&gt;Mengubah data customer.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6345&quot; data-start=&quot;6320&quot;&gt;
&lt;p data-end=&quot;6345&quot; data-start=&quot;6322&quot;&gt;Menonaktifkan customer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6538&quot; data-start=&quot;6346&quot;&gt;
&lt;p data-end=&quot;6370&quot; data-start=&quot;6348&quot;&gt;Data minimal customer:&lt;/p&gt;
&lt;ul data-end=&quot;6538&quot; data-start=&quot;6373&quot;&gt;
&lt;li data-end=&quot;6396&quot; data-start=&quot;6373&quot;&gt;
&lt;p data-end=&quot;6396&quot; data-start=&quot;6375&quot;&gt;Kode customer (unik).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6406&quot; data-start=&quot;6399&quot;&gt;
&lt;p data-end=&quot;6406&quot; data-start=&quot;6401&quot;&gt;Nama.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6418&quot; data-start=&quot;6409&quot;&gt;
&lt;p data-end=&quot;6418&quot; data-start=&quot;6411&quot;&gt;Alamat.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6435&quot; data-start=&quot;6421&quot;&gt;
&lt;p data-end=&quot;6435&quot; data-start=&quot;6423&quot;&gt;No. telepon.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6446&quot; data-start=&quot;6438&quot;&gt;
&lt;p data-end=&quot;6446&quot; data-start=&quot;6440&quot;&gt;Email.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6467&quot; data-start=&quot;6449&quot;&gt;
&lt;p data-end=&quot;6467&quot; data-start=&quot;6451&quot;&gt;NPWP (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6509&quot; data-start=&quot;6470&quot;&gt;
&lt;p data-end=&quot;6509&quot; data-start=&quot;6472&quot;&gt;Term pembayaran (Net 7, Net 30, dll).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6538&quot; data-start=&quot;6512&quot;&gt;
&lt;p data-end=&quot;6538&quot; data-start=&quot;6514&quot;&gt;Status (aktif/nonaktif).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;6575&quot; data-start=&quot;6540&quot;&gt;FR-021 – Master Produk (Sales)&lt;/h4&gt;
&lt;ul data-end=&quot;6829&quot; data-start=&quot;6576&quot;&gt;
&lt;li data-end=&quot;6644&quot; data-start=&quot;6576&quot;&gt;
&lt;p data-end=&quot;6644&quot; data-start=&quot;6578&quot;&gt;Sistem menyimpan master produk yang digunakan di Sales &amp;amp; Purchase.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6829&quot; data-start=&quot;6645&quot;&gt;
&lt;p data-end=&quot;6660&quot; data-start=&quot;6647&quot;&gt;Data minimal:&lt;/p&gt;
&lt;ul data-end=&quot;6829&quot; data-start=&quot;6663&quot;&gt;
&lt;li data-end=&quot;6684&quot; data-start=&quot;6663&quot;&gt;
&lt;p data-end=&quot;6684&quot; data-start=&quot;6665&quot;&gt;Kode produk (unik).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6701&quot; data-start=&quot;6687&quot;&gt;
&lt;p data-end=&quot;6701&quot; data-start=&quot;6689&quot;&gt;Nama produk.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6722&quot; data-start=&quot;6704&quot;&gt;
&lt;p data-end=&quot;6722&quot; data-start=&quot;6706&quot;&gt;Kategori produk.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6741&quot; data-start=&quot;6725&quot;&gt;
&lt;p data-end=&quot;6741&quot; data-start=&quot;6727&quot;&gt;Satuan (unit).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6765&quot; data-start=&quot;6744&quot;&gt;
&lt;p data-end=&quot;6765&quot; data-start=&quot;6746&quot;&gt;Harga jual default.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6800&quot; data-start=&quot;6768&quot;&gt;
&lt;p data-end=&quot;6800&quot; data-start=&quot;6770&quot;&gt;Harga beli default (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6829&quot; data-start=&quot;6803&quot;&gt;
&lt;p data-end=&quot;6829&quot; data-start=&quot;6805&quot;&gt;Status (aktif/nonaktif).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;6853&quot; data-start=&quot;6831&quot;&gt;3.3.2 Proses Sales&lt;/h3&gt;
&lt;h4 data-end=&quot;6890&quot; data-start=&quot;6855&quot;&gt;FR-030 – Penawaran (Quotation)&lt;/h4&gt;
&lt;ul data-end=&quot;7218&quot; data-start=&quot;6891&quot;&gt;
&lt;li data-end=&quot;7036&quot; data-start=&quot;6891&quot;&gt;
&lt;p data-end=&quot;6928&quot; data-start=&quot;6893&quot;&gt;User Sales dapat membuat quotation:&lt;/p&gt;
&lt;ul data-end=&quot;7036&quot; data-start=&quot;6931&quot;&gt;
&lt;li data-end=&quot;6950&quot; data-start=&quot;6931&quot;&gt;
&lt;p data-end=&quot;6950&quot; data-start=&quot;6933&quot;&gt;Memilih customer.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7000&quot; data-start=&quot;6953&quot;&gt;
&lt;p data-end=&quot;7000&quot; data-start=&quot;6955&quot;&gt;Menambahkan item produk (qty, harga, diskon).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7036&quot; data-start=&quot;7003&quot;&gt;
&lt;p data-end=&quot;7036&quot; data-start=&quot;7005&quot;&gt;Menambahkan syarat &amp;amp; ketentuan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7146&quot; data-start=&quot;7037&quot;&gt;
&lt;p data-end=&quot;7057&quot; data-start=&quot;7039&quot;&gt;Sistem menghitung:&lt;/p&gt;
&lt;ul data-end=&quot;7146&quot; data-start=&quot;7060&quot;&gt;
&lt;li data-end=&quot;7080&quot; data-start=&quot;7060&quot;&gt;
&lt;p data-end=&quot;7080&quot; data-start=&quot;7062&quot;&gt;Subtotal per item.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7092&quot; data-start=&quot;7083&quot;&gt;
&lt;p data-end=&quot;7092&quot; data-start=&quot;7085&quot;&gt;Diskon.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7119&quot; data-start=&quot;7095&quot;&gt;
&lt;p data-end=&quot;7119&quot; data-start=&quot;7097&quot;&gt;PPN (jika diperlukan).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7146&quot; data-start=&quot;7122&quot;&gt;
&lt;p data-end=&quot;7146&quot; data-start=&quot;7124&quot;&gt;Total nilai penawaran.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7218&quot; data-start=&quot;7147&quot;&gt;
&lt;p data-end=&quot;7166&quot; data-start=&quot;7149&quot;&gt;Status quotation:&lt;/p&gt;
&lt;ul data-end=&quot;7218&quot; data-start=&quot;7169&quot;&gt;
&lt;li data-end=&quot;7218&quot; data-start=&quot;7169&quot;&gt;
&lt;p data-end=&quot;7218&quot; data-start=&quot;7171&quot;&gt;Draft → Sent → Won (menjadi SO) / Lost (gagal).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;7267&quot; data-start=&quot;7220&quot;&gt;FR-031 – Konversi Quotation ke Sales Order&lt;/h4&gt;
&lt;ul data-end=&quot;7485&quot; data-start=&quot;7268&quot;&gt;
&lt;li data-end=&quot;7337&quot; data-start=&quot;7268&quot;&gt;
&lt;p data-end=&quot;7337&quot; data-start=&quot;7270&quot;&gt;Quotation dengan status “Won” dapat dikonversi menjadi Sales Order.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7414&quot; data-start=&quot;7338&quot;&gt;
&lt;p data-end=&quot;7361&quot; data-start=&quot;7340&quot;&gt;Data yang diturunkan:&lt;/p&gt;
&lt;ul data-end=&quot;7414&quot; data-start=&quot;7364&quot;&gt;
&lt;li data-end=&quot;7414&quot; data-start=&quot;7364&quot;&gt;
&lt;p data-end=&quot;7414&quot; data-start=&quot;7366&quot;&gt;Customer, daftar item, harga, syarat pembayaran.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7485&quot; data-start=&quot;7415&quot;&gt;
&lt;p data-end=&quot;7485&quot; data-start=&quot;7417&quot;&gt;Nomor SO di-generate otomatis dengan format tertentu (configurable).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;7528&quot; data-start=&quot;7487&quot;&gt;FR-032 – Sales Order (SO) Management&lt;/h4&gt;
&lt;ul data-end=&quot;7936&quot; data-start=&quot;7529&quot;&gt;
&lt;li data-end=&quot;7687&quot; data-start=&quot;7529&quot;&gt;
&lt;p data-end=&quot;7548&quot; data-start=&quot;7531&quot;&gt;User Sales dapat:&lt;/p&gt;
&lt;ul data-end=&quot;7687&quot; data-start=&quot;7551&quot;&gt;
&lt;li data-end=&quot;7607&quot; data-start=&quot;7551&quot;&gt;
&lt;p data-end=&quot;7607&quot; data-start=&quot;7553&quot;&gt;Membuat SO langsung (tanpa quotation) jika diperlukan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7650&quot; data-start=&quot;7610&quot;&gt;
&lt;p data-end=&quot;7650&quot; data-start=&quot;7612&quot;&gt;Mengubah SO selama status masih Draft.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7687&quot; data-start=&quot;7653&quot;&gt;
&lt;p data-end=&quot;7687&quot; data-start=&quot;7655&quot;&gt;Melihat histori SO per customer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7840&quot; data-start=&quot;7688&quot;&gt;
&lt;p data-end=&quot;7700&quot; data-start=&quot;7690&quot;&gt;Status SO:&lt;/p&gt;
&lt;ul data-end=&quot;7840&quot; data-start=&quot;7703&quot;&gt;
&lt;li data-end=&quot;7840&quot; data-start=&quot;7703&quot;&gt;
&lt;p data-end=&quot;7840&quot; data-start=&quot;7705&quot;&gt;Draft → Confirmed → Partially Delivered (opsional) → Fully Delivered → Invoiced (parsial/ penuh) → Paid (diatur oleh modul accounting).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;7936&quot; data-start=&quot;7841&quot;&gt;
&lt;p data-end=&quot;7936&quot; data-start=&quot;7843&quot;&gt;SO yang sudah Confirmed tidak dapat dihapus, hanya dapat dibatalkan (void) dengan log alasan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;7997&quot; data-start=&quot;7938&quot;&gt;FR-033 – Pengiriman Barang (Delivery Order) (opsional)&lt;/h4&gt;
&lt;ul data-end=&quot;8168&quot; data-start=&quot;7998&quot;&gt;
&lt;li data-end=&quot;8098&quot; data-start=&quot;7998&quot;&gt;
&lt;p data-end=&quot;8033&quot; data-start=&quot;8000&quot;&gt;Sistem dapat mencatat pengiriman:&lt;/p&gt;
&lt;ul data-end=&quot;8098&quot; data-start=&quot;8036&quot;&gt;
&lt;li data-end=&quot;8054&quot; data-start=&quot;8036&quot;&gt;
&lt;p data-end=&quot;8054&quot; data-start=&quot;8038&quot;&gt;Mengacu pada SO.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8098&quot; data-start=&quot;8057&quot;&gt;
&lt;p data-end=&quot;8098&quot; data-start=&quot;8059&quot;&gt;User memilih item dan qty yang dikirim.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8168&quot; data-start=&quot;8099&quot;&gt;
&lt;p data-end=&quot;8168&quot; data-start=&quot;8101&quot;&gt;Status pengiriman mempengaruhi status SO (Partial/Fully Delivered).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;8210&quot; data-start=&quot;8170&quot;&gt;FR-034 – Invoice Penjualan Otomatis&lt;/h4&gt;
&lt;ul data-end=&quot;8622&quot; data-start=&quot;8211&quot;&gt;
&lt;li data-end=&quot;8309&quot; data-start=&quot;8211&quot;&gt;
&lt;p data-end=&quot;8309&quot; data-start=&quot;8213&quot;&gt;Dari SO yang sudah Confirmed (atau dari Delivery Order), sistem dapat membuat invoice penjualan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8421&quot; data-start=&quot;8310&quot;&gt;
&lt;p data-end=&quot;8325&quot; data-start=&quot;8312&quot;&gt;Data invoice:&lt;/p&gt;
&lt;ul data-end=&quot;8421&quot; data-start=&quot;8328&quot;&gt;
&lt;li data-end=&quot;8357&quot; data-start=&quot;8328&quot;&gt;
&lt;p data-end=&quot;8357&quot; data-start=&quot;8330&quot;&gt;Customer, alamat penagihan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8382&quot; data-start=&quot;8360&quot;&gt;
&lt;p data-end=&quot;8382&quot; data-start=&quot;8362&quot;&gt;Daftar item &amp;amp; harga.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8399&quot; data-start=&quot;8385&quot;&gt;
&lt;p data-end=&quot;8399&quot; data-start=&quot;8387&quot;&gt;Pajak (PPN).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8421&quot; data-start=&quot;8402&quot;&gt;
&lt;p data-end=&quot;8421&quot; data-start=&quot;8404&quot;&gt;Terms &amp;amp; due date.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8495&quot; data-start=&quot;8422&quot;&gt;
&lt;p data-end=&quot;8439&quot; data-start=&quot;8424&quot;&gt;Status invoice:&lt;/p&gt;
&lt;ul data-end=&quot;8495&quot; data-start=&quot;8442&quot;&gt;
&lt;li data-end=&quot;8495&quot; data-start=&quot;8442&quot;&gt;
&lt;p data-end=&quot;8495&quot; data-start=&quot;8444&quot;&gt;Draft → Posted → Paid / Partially Paid / Cancelled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8622&quot; data-start=&quot;8496&quot;&gt;
&lt;p data-end=&quot;8528&quot; data-start=&quot;8498&quot;&gt;Saat Invoice berstatus Posted:&lt;/p&gt;
&lt;ul data-end=&quot;8622&quot; data-start=&quot;8531&quot;&gt;
&lt;li data-end=&quot;8622&quot; data-start=&quot;8531&quot;&gt;
&lt;p data-end=&quot;8622&quot; data-start=&quot;8533&quot;&gt;Sistem harus membuat jurnal akuntansi otomatis (Piutang Dagang, Penjualan, PPN Keluaran).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;8627&quot; data-start=&quot;8624&quot; /&gt;
&lt;h2 data-end=&quot;8656&quot; data-start=&quot;8629&quot;&gt;3.4 Modul Purchase Order&lt;/h2&gt;
&lt;h3 data-end=&quot;8688&quot; data-start=&quot;8658&quot;&gt;3.4.1 Master Data Purchase&lt;/h3&gt;
&lt;h4 data-end=&quot;8717&quot; data-start=&quot;8690&quot;&gt;FR-040 – Master Vendor&lt;/h4&gt;
&lt;ul data-end=&quot;8989&quot; data-start=&quot;8718&quot;&gt;
&lt;li data-end=&quot;8826&quot; data-start=&quot;8718&quot;&gt;
&lt;p data-end=&quot;8750&quot; data-start=&quot;8720&quot;&gt;User Purchasing / Admin dapat:&lt;/p&gt;
&lt;ul data-end=&quot;8826&quot; data-start=&quot;8753&quot;&gt;
&lt;li data-end=&quot;8774&quot; data-start=&quot;8753&quot;&gt;
&lt;p data-end=&quot;8774&quot; data-start=&quot;8755&quot;&gt;Menambahkan vendor.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8800&quot; data-start=&quot;8777&quot;&gt;
&lt;p data-end=&quot;8800&quot; data-start=&quot;8779&quot;&gt;Mengubah data vendor.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8826&quot; data-start=&quot;8803&quot;&gt;
&lt;p data-end=&quot;8826&quot; data-start=&quot;8805&quot;&gt;Menonaktifkan vendor.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8989&quot; data-start=&quot;8827&quot;&gt;
&lt;p data-end=&quot;8842&quot; data-start=&quot;8829&quot;&gt;Data minimal:&lt;/p&gt;
&lt;ul data-end=&quot;8989&quot; data-start=&quot;8845&quot;&gt;
&lt;li data-end=&quot;8866&quot; data-start=&quot;8845&quot;&gt;
&lt;p data-end=&quot;8866&quot; data-start=&quot;8847&quot;&gt;Kode vendor (unik).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8876&quot; data-start=&quot;8869&quot;&gt;
&lt;p data-end=&quot;8876&quot; data-start=&quot;8871&quot;&gt;Nama.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8888&quot; data-start=&quot;8879&quot;&gt;
&lt;p data-end=&quot;8888&quot; data-start=&quot;8881&quot;&gt;Alamat.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8907&quot; data-start=&quot;8891&quot;&gt;
&lt;p data-end=&quot;8907&quot; data-start=&quot;8893&quot;&gt;Kontak person.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8924&quot; data-start=&quot;8910&quot;&gt;
&lt;p data-end=&quot;8924&quot; data-start=&quot;8912&quot;&gt;No. telepon.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8935&quot; data-start=&quot;8927&quot;&gt;
&lt;p data-end=&quot;8935&quot; data-start=&quot;8929&quot;&gt;Email.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8956&quot; data-start=&quot;8938&quot;&gt;
&lt;p data-end=&quot;8956&quot; data-start=&quot;8940&quot;&gt;NPWP (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8977&quot; data-start=&quot;8959&quot;&gt;
&lt;p data-end=&quot;8977&quot; data-start=&quot;8961&quot;&gt;Term pembayaran.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;8989&quot; data-start=&quot;8980&quot;&gt;
&lt;p data-end=&quot;8989&quot; data-start=&quot;8982&quot;&gt;Status.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;9016&quot; data-start=&quot;8991&quot;&gt;3.4.2 Proses Purchase&lt;/h3&gt;
&lt;h4 data-end=&quot;9063&quot; data-start=&quot;9018&quot;&gt;FR-050 – Purchase Requisition (Opsional)&lt;/h4&gt;
&lt;ul data-end=&quot;9225&quot; data-start=&quot;9064&quot;&gt;
&lt;li data-end=&quot;9169&quot; data-start=&quot;9064&quot;&gt;
&lt;p data-end=&quot;9118&quot; data-start=&quot;9066&quot;&gt;User non-purchasing dapat membuat request pembelian:&lt;/p&gt;
&lt;ul data-end=&quot;9169&quot; data-start=&quot;9121&quot;&gt;
&lt;li data-end=&quot;9169&quot; data-start=&quot;9121&quot;&gt;
&lt;p data-end=&quot;9169&quot; data-start=&quot;9123&quot;&gt;Menginput barang yang dibutuhkan, qty, alasan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9225&quot; data-start=&quot;9170&quot;&gt;
&lt;p data-end=&quot;9225&quot; data-start=&quot;9172&quot;&gt;Purchasing dapat meng-approve dan mengkonversi ke PO.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;9260&quot; data-start=&quot;9227&quot;&gt;FR-051 – Purchase Order (PO)&lt;/h4&gt;
&lt;ul data-end=&quot;9605&quot; data-start=&quot;9261&quot;&gt;
&lt;li data-end=&quot;9393&quot; data-start=&quot;9261&quot;&gt;
&lt;p data-end=&quot;9296&quot; data-start=&quot;9263&quot;&gt;User Purchasing dapat membuat PO:&lt;/p&gt;
&lt;ul data-end=&quot;9393&quot; data-start=&quot;9299&quot;&gt;
&lt;li data-end=&quot;9314&quot; data-start=&quot;9299&quot;&gt;
&lt;p data-end=&quot;9314&quot; data-start=&quot;9301&quot;&gt;Pilih vendor.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9352&quot; data-start=&quot;9317&quot;&gt;
&lt;p data-end=&quot;9352&quot; data-start=&quot;9319&quot;&gt;Daftar item (produk), qty, harga.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9393&quot; data-start=&quot;9355&quot;&gt;
&lt;p data-end=&quot;9393&quot; data-start=&quot;9357&quot;&gt;syarat pembayaran, delivery address.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9467&quot; data-start=&quot;9394&quot;&gt;
&lt;p data-end=&quot;9414&quot; data-start=&quot;9396&quot;&gt;sistem menghitung:&lt;/p&gt;
&lt;ul data-end=&quot;9467&quot; data-start=&quot;9417&quot;&gt;
&lt;li data-end=&quot;9428&quot; data-start=&quot;9417&quot;&gt;
&lt;p data-end=&quot;9428&quot; data-start=&quot;9419&quot;&gt;Subtotal.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9453&quot; data-start=&quot;9431&quot;&gt;
&lt;p data-end=&quot;9453&quot; data-start=&quot;9433&quot;&gt;Pajak (PPN masukan).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9467&quot; data-start=&quot;9456&quot;&gt;
&lt;p data-end=&quot;9467&quot; data-start=&quot;9458&quot;&gt;Total PO.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9547&quot; data-start=&quot;9468&quot;&gt;
&lt;p data-end=&quot;9480&quot; data-start=&quot;9470&quot;&gt;Status PO:&lt;/p&gt;
&lt;ul data-end=&quot;9547&quot; data-start=&quot;9483&quot;&gt;
&lt;li data-end=&quot;9547&quot; data-start=&quot;9483&quot;&gt;
&lt;p data-end=&quot;9547&quot; data-start=&quot;9485&quot;&gt;Draft → Confirmed → Received (partial/full) → Invoiced → Paid.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9605&quot; data-start=&quot;9548&quot;&gt;
&lt;p data-end=&quot;9605&quot; data-start=&quot;9550&quot;&gt;PO yang Confirmed tidak bisa dihapus, hanya dibatalkan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;9654&quot; data-start=&quot;9607&quot;&gt;FR-052 – Penerimaan Barang (Goods Receipt)&lt;/h4&gt;
&lt;ul data-end=&quot;9887&quot; data-start=&quot;9655&quot;&gt;
&lt;li data-end=&quot;9766&quot; data-start=&quot;9655&quot;&gt;
&lt;p data-end=&quot;9698&quot; data-start=&quot;9657&quot;&gt;Dari PO, user mencatat penerimaan barang:&lt;/p&gt;
&lt;ul data-end=&quot;9766&quot; data-start=&quot;9701&quot;&gt;
&lt;li data-end=&quot;9730&quot; data-start=&quot;9701&quot;&gt;
&lt;p data-end=&quot;9730&quot; data-start=&quot;9703&quot;&gt;Qty yang diterima per item.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9766&quot; data-start=&quot;9733&quot;&gt;
&lt;p data-end=&quot;9766&quot; data-start=&quot;9735&quot;&gt;Batch/serial number (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9887&quot; data-start=&quot;9767&quot;&gt;
&lt;p data-end=&quot;9800&quot; data-start=&quot;9769&quot;&gt;Status penerimaan mempengaruhi:&lt;/p&gt;
&lt;ul data-end=&quot;9887&quot; data-start=&quot;9803&quot;&gt;
&lt;li data-end=&quot;9830&quot; data-start=&quot;9803&quot;&gt;
&lt;p data-end=&quot;9830&quot; data-start=&quot;9805&quot;&gt;Status PO (Partial/Full).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;9887&quot; data-start=&quot;9833&quot;&gt;
&lt;p data-end=&quot;9887&quot; data-start=&quot;9835&quot;&gt;Stok barang jika nanti ada modul Inventory (future).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;9929&quot; data-start=&quot;9889&quot;&gt;FR-053 – Invoice Pembelian Otomatis&lt;/h4&gt;
&lt;ul data-end=&quot;10258&quot; data-start=&quot;9930&quot;&gt;
&lt;li data-end=&quot;9998&quot; data-start=&quot;9930&quot;&gt;
&lt;p data-end=&quot;9998&quot; data-start=&quot;9932&quot;&gt;Dari PO (Confirmed/Received) user dapat membuat invoice pembelian.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10090&quot; data-start=&quot;9999&quot;&gt;
&lt;p data-end=&quot;10014&quot; data-start=&quot;10001&quot;&gt;Data invoice:&lt;/p&gt;
&lt;ul data-end=&quot;10090&quot; data-start=&quot;10017&quot;&gt;
&lt;li data-end=&quot;10051&quot; data-start=&quot;10017&quot;&gt;
&lt;p data-end=&quot;10051&quot; data-start=&quot;10019&quot;&gt;Vendor, alamat, terms, due date.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10090&quot; data-start=&quot;10054&quot;&gt;
&lt;p data-end=&quot;10090&quot; data-start=&quot;10056&quot;&gt;Item &amp;amp; harga, pajak (PPN masukan).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10164&quot; data-start=&quot;10091&quot;&gt;
&lt;p data-end=&quot;10108&quot; data-start=&quot;10093&quot;&gt;Status invoice:&lt;/p&gt;
&lt;ul data-end=&quot;10164&quot; data-start=&quot;10111&quot;&gt;
&lt;li data-end=&quot;10164&quot; data-start=&quot;10111&quot;&gt;
&lt;p data-end=&quot;10164&quot; data-start=&quot;10113&quot;&gt;Draft → Posted → Paid / Partially Paid / Cancelled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10258&quot; data-start=&quot;10165&quot;&gt;
&lt;p data-end=&quot;10258&quot; data-start=&quot;10167&quot;&gt;Saat Posted, sistem membuat jurnal otomatis (Hutang Dagang, Persediaan/Beban, PPN Masukan).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;10263&quot; data-start=&quot;10260&quot; /&gt;
&lt;h2 data-end=&quot;10288&quot; data-start=&quot;10265&quot;&gt;3.5 Modul Accounting&lt;/h2&gt;
&lt;h3 data-end=&quot;10321&quot; data-start=&quot;10290&quot;&gt;3.5.1 Master Data Akuntansi&lt;/h3&gt;
&lt;h4 data-end=&quot;10360&quot; data-start=&quot;10323&quot;&gt;FR-060 – Chart of Accounts (CoA)&lt;/h4&gt;
&lt;ul data-end=&quot;10650&quot; data-start=&quot;10361&quot;&gt;
&lt;li data-end=&quot;10579&quot; data-start=&quot;10361&quot;&gt;
&lt;p data-end=&quot;10390&quot; data-start=&quot;10363&quot;&gt;User Finance / Admin dapat:&lt;/p&gt;
&lt;ul data-end=&quot;10579&quot; data-start=&quot;10393&quot;&gt;
&lt;li data-end=&quot;10436&quot; data-start=&quot;10393&quot;&gt;
&lt;p data-end=&quot;10436&quot; data-start=&quot;10395&quot;&gt;Definisikan akun-akun (kode, nama, tipe).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10513&quot; data-start=&quot;10439&quot;&gt;
&lt;p data-end=&quot;10463&quot; data-start=&quot;10441&quot;&gt;Menandai akun sebagai:&lt;/p&gt;
&lt;ul data-end=&quot;10513&quot; data-start=&quot;10468&quot;&gt;
&lt;li data-end=&quot;10513&quot; data-start=&quot;10468&quot;&gt;
&lt;p data-end=&quot;10513&quot; data-start=&quot;10470&quot;&gt;Asset, Liability, Equity, Revenue, Expense.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10579&quot; data-start=&quot;10516&quot;&gt;
&lt;p data-end=&quot;10579&quot; data-start=&quot;10518&quot;&gt;Menonaktifkan akun (tidak bisa dipakai untuk transaksi baru).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10650&quot; data-start=&quot;10580&quot;&gt;
&lt;p data-end=&quot;10650&quot; data-start=&quot;10582&quot;&gt;Sistem harus mencegah penghapusan akun yang sudah dipakai di jurnal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;10687&quot; data-start=&quot;10652&quot;&gt;FR-061 – Journal Configuration&lt;/h4&gt;
&lt;ul data-end=&quot;10932&quot; data-start=&quot;10688&quot;&gt;
&lt;li data-end=&quot;10846&quot; data-start=&quot;10688&quot;&gt;
&lt;p data-end=&quot;10730&quot; data-start=&quot;10690&quot;&gt;Sistem memberikan template jurnal untuk:&lt;/p&gt;
&lt;ul data-end=&quot;10846&quot; data-start=&quot;10733&quot;&gt;
&lt;li data-end=&quot;10761&quot; data-start=&quot;10733&quot;&gt;
&lt;p data-end=&quot;10761&quot; data-start=&quot;10735&quot;&gt;Penjualan (Sales Journal).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10795&quot; data-start=&quot;10764&quot;&gt;
&lt;p data-end=&quot;10795&quot; data-start=&quot;10766&quot;&gt;Pembelian (Purchase Journal).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10829&quot; data-start=&quot;10798&quot;&gt;
&lt;p data-end=&quot;10829&quot; data-start=&quot;10800&quot;&gt;Kas/Bank (Cash/Bank Journal).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10846&quot; data-start=&quot;10832&quot;&gt;
&lt;p data-end=&quot;10846&quot; data-start=&quot;10834&quot;&gt;Jurnal Umum.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;10932&quot; data-start=&quot;10847&quot;&gt;
&lt;p data-end=&quot;10932&quot; data-start=&quot;10849&quot;&gt;Masing-masing jurnal menentukan default akun yang digunakan untuk posting otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;10963&quot; data-start=&quot;10934&quot;&gt;3.5.2 Transaksi Akuntansi&lt;/h3&gt;
&lt;h4 data-end=&quot;10994&quot; data-start=&quot;10965&quot;&gt;FR-070 – Jurnal Otomatis&lt;/h4&gt;
&lt;ul data-end=&quot;11209&quot; data-start=&quot;10995&quot;&gt;
&lt;li data-end=&quot;11128&quot; data-start=&quot;10995&quot;&gt;
&lt;p data-end=&quot;11040&quot; data-start=&quot;10997&quot;&gt;Dari Invoice Penjualan &amp;amp; Pembelian, sistem:&lt;/p&gt;
&lt;ul data-end=&quot;11128&quot; data-start=&quot;11043&quot;&gt;
&lt;li data-end=&quot;11082&quot; data-start=&quot;11043&quot;&gt;
&lt;p data-end=&quot;11082&quot; data-start=&quot;11045&quot;&gt;Membuat jurnal double-entry otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11128&quot; data-start=&quot;11085&quot;&gt;
&lt;p data-end=&quot;11128&quot; data-start=&quot;11087&quot;&gt;Menandai jurnal sebagai “Auto Generated”.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11209&quot; data-start=&quot;11129&quot;&gt;
&lt;p data-end=&quot;11150&quot; data-start=&quot;11131&quot;&gt;Contoh (Penjualan):&lt;/p&gt;
&lt;ul data-end=&quot;11209&quot; data-start=&quot;11153&quot;&gt;
&lt;li data-end=&quot;11172&quot; data-start=&quot;11153&quot;&gt;
&lt;p data-end=&quot;11172&quot; data-start=&quot;11155&quot;&gt;Dr Piutang Dagang&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11189&quot; data-start=&quot;11175&quot;&gt;
&lt;p data-end=&quot;11189&quot; data-start=&quot;11177&quot;&gt;Cr Penjualan&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11209&quot; data-start=&quot;11192&quot;&gt;
&lt;p data-end=&quot;11209&quot; data-start=&quot;11194&quot;&gt;Cr PPN Keluaran&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;11243&quot; data-start=&quot;11211&quot;&gt;FR-071 – Jurnal Umum Manual&lt;/h4&gt;
&lt;ul data-end=&quot;11493&quot; data-start=&quot;11244&quot;&gt;
&lt;li data-end=&quot;11388&quot; data-start=&quot;11244&quot;&gt;
&lt;p data-end=&quot;11287&quot; data-start=&quot;11246&quot;&gt;User Finance dapat membuat jurnal manual:&lt;/p&gt;
&lt;ul data-end=&quot;11388&quot; data-start=&quot;11290&quot;&gt;
&lt;li data-end=&quot;11317&quot; data-start=&quot;11290&quot;&gt;
&lt;p data-end=&quot;11317&quot; data-start=&quot;11292&quot;&gt;Memilih jurnal (General).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11351&quot; data-start=&quot;11320&quot;&gt;
&lt;p data-end=&quot;11351&quot; data-start=&quot;11322&quot;&gt;Menginput tanggal, deskripsi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11388&quot; data-start=&quot;11354&quot;&gt;
&lt;p data-end=&quot;11388&quot; data-start=&quot;11356&quot;&gt;Daftar akun dengan debit/kredit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11442&quot; data-start=&quot;11389&quot;&gt;
&lt;p data-end=&quot;11410&quot; data-start=&quot;11391&quot;&gt;Sistem memvalidasi:&lt;/p&gt;
&lt;ul data-end=&quot;11442&quot; data-start=&quot;11413&quot;&gt;
&lt;li data-end=&quot;11442&quot; data-start=&quot;11413&quot;&gt;
&lt;p data-end=&quot;11442&quot; data-start=&quot;11415&quot;&gt;Total debit = total kredit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11493&quot; data-start=&quot;11443&quot;&gt;
&lt;p data-end=&quot;11473&quot; data-start=&quot;11445&quot;&gt;Jurnal manual diberi status:&lt;/p&gt;
&lt;ul data-end=&quot;11493&quot; data-start=&quot;11476&quot;&gt;
&lt;li data-end=&quot;11493&quot; data-start=&quot;11476&quot;&gt;
&lt;p data-end=&quot;11493&quot; data-start=&quot;11478&quot;&gt;Draft → Posted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;11532&quot; data-start=&quot;11495&quot;&gt;FR-072 – Rekonsiliasi Pembayaran&lt;/h4&gt;
&lt;ul data-end=&quot;11812&quot; data-start=&quot;11533&quot;&gt;
&lt;li data-end=&quot;11639&quot; data-start=&quot;11533&quot;&gt;
&lt;p data-end=&quot;11554&quot; data-start=&quot;11535&quot;&gt;Pembayaran piutang:&lt;/p&gt;
&lt;ul data-end=&quot;11639&quot; data-start=&quot;11557&quot;&gt;
&lt;li data-end=&quot;11609&quot; data-start=&quot;11557&quot;&gt;
&lt;p data-end=&quot;11609&quot; data-start=&quot;11559&quot;&gt;Menghubungkan pembayaran dengan invoice penjualan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11639&quot; data-start=&quot;11612&quot;&gt;
&lt;p data-end=&quot;11639&quot; data-start=&quot;11614&quot;&gt;Mengurangi saldo piutang.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11733&quot; data-start=&quot;11640&quot;&gt;
&lt;p data-end=&quot;11660&quot; data-start=&quot;11642&quot;&gt;Pembayaran hutang:&lt;/p&gt;
&lt;ul data-end=&quot;11733&quot; data-start=&quot;11663&quot;&gt;
&lt;li data-end=&quot;11704&quot; data-start=&quot;11663&quot;&gt;
&lt;p data-end=&quot;11704&quot; data-start=&quot;11665&quot;&gt;Menghubungkan dengan invoice pembelian.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11733&quot; data-start=&quot;11707&quot;&gt;
&lt;p data-end=&quot;11733&quot; data-start=&quot;11709&quot;&gt;Mengurangi saldo hutang.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11812&quot; data-start=&quot;11734&quot;&gt;
&lt;p data-end=&quot;11812&quot; data-start=&quot;11736&quot;&gt;Sistem harus menampilkan status invoice (Paid, Partially Paid, Outstanding).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;11840&quot; data-start=&quot;11814&quot;&gt;3.5.3 Laporan Keuangan&lt;/h3&gt;
&lt;h4 data-end=&quot;11891&quot; data-start=&quot;11842&quot;&gt;FR-080 – Laporan Buku Besar (General Ledger)&lt;/h4&gt;
&lt;ul data-end=&quot;12062&quot; data-start=&quot;11892&quot;&gt;
&lt;li data-end=&quot;11977&quot; data-start=&quot;11892&quot;&gt;
&lt;p data-end=&quot;11929&quot; data-start=&quot;11894&quot;&gt;User Finance dapat melihat laporan:&lt;/p&gt;
&lt;ul data-end=&quot;11977&quot; data-start=&quot;11932&quot;&gt;
&lt;li data-end=&quot;11943&quot; data-start=&quot;11932&quot;&gt;
&lt;p data-end=&quot;11943&quot; data-start=&quot;11934&quot;&gt;Per akun.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;11977&quot; data-start=&quot;11946&quot;&gt;
&lt;p data-end=&quot;11977&quot; data-start=&quot;11948&quot;&gt;Per periode (filter tanggal).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12062&quot; data-start=&quot;11978&quot;&gt;
&lt;p data-end=&quot;11992&quot; data-start=&quot;11980&quot;&gt;Menampilkan:&lt;/p&gt;
&lt;ul data-end=&quot;12062&quot; data-start=&quot;11995&quot;&gt;
&lt;li data-end=&quot;12008&quot; data-start=&quot;11995&quot;&gt;
&lt;p data-end=&quot;12008&quot; data-start=&quot;11997&quot;&gt;Saldo awal.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12045&quot; data-start=&quot;12011&quot;&gt;
&lt;p data-end=&quot;12045&quot; data-start=&quot;12013&quot;&gt;Daftar transaksi (debit/kredit).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12062&quot; data-start=&quot;12048&quot;&gt;
&lt;p data-end=&quot;12062&quot; data-start=&quot;12050&quot;&gt;Saldo akhir.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;12106&quot; data-start=&quot;12064&quot;&gt;FR-081 – Trial Balance (Neraca Saldo)&lt;/h4&gt;
&lt;ul data-end=&quot;12203&quot; data-start=&quot;12107&quot;&gt;
&lt;li data-end=&quot;12203&quot; data-start=&quot;12107&quot;&gt;
&lt;p data-end=&quot;12128&quot; data-start=&quot;12109&quot;&gt;Sistem menampilkan:&lt;/p&gt;
&lt;ul data-end=&quot;12203&quot; data-start=&quot;12131&quot;&gt;
&lt;li data-end=&quot;12181&quot; data-start=&quot;12131&quot;&gt;
&lt;p data-end=&quot;12181&quot; data-start=&quot;12133&quot;&gt;Daftar akun dengan total debit/kredit dan saldo.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12203&quot; data-start=&quot;12184&quot;&gt;
&lt;p data-end=&quot;12203&quot; data-start=&quot;12186&quot;&gt;Periode tertentu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;12236&quot; data-start=&quot;12205&quot;&gt;FR-082 – Laporan Laba Rugi&lt;/h4&gt;
&lt;ul data-end=&quot;12312&quot; data-start=&quot;12237&quot;&gt;
&lt;li data-end=&quot;12312&quot; data-start=&quot;12237&quot;&gt;
&lt;p data-end=&quot;12263&quot; data-start=&quot;12239&quot;&gt;Sistem menyusun laporan:&lt;/p&gt;
&lt;ul data-end=&quot;12312&quot; data-start=&quot;12266&quot;&gt;
&lt;li data-end=&quot;12279&quot; data-start=&quot;12266&quot;&gt;
&lt;p data-end=&quot;12279&quot; data-start=&quot;12268&quot;&gt;Pendapatan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12290&quot; data-start=&quot;12282&quot;&gt;
&lt;p data-end=&quot;12290&quot; data-start=&quot;12284&quot;&gt;Beban.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12312&quot; data-start=&quot;12293&quot;&gt;
&lt;p data-end=&quot;12312&quot; data-start=&quot;12295&quot;&gt;Laba/rugi bersih.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;12350&quot; data-start=&quot;12314&quot;&gt;FR-083 – Neraca (Balance Sheet)&lt;/h4&gt;
&lt;ul data-end=&quot;12407&quot; data-start=&quot;12351&quot;&gt;
&lt;li data-end=&quot;12407&quot; data-start=&quot;12351&quot;&gt;
&lt;p data-end=&quot;12369&quot; data-start=&quot;12353&quot;&gt;Sistem menyusun:&lt;/p&gt;
&lt;ul data-end=&quot;12407&quot; data-start=&quot;12372&quot;&gt;
&lt;li data-end=&quot;12379&quot; data-start=&quot;12372&quot;&gt;
&lt;p data-end=&quot;12379&quot; data-start=&quot;12374&quot;&gt;Aset.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12394&quot; data-start=&quot;12382&quot;&gt;
&lt;p data-end=&quot;12394&quot; data-start=&quot;12384&quot;&gt;Kewajiban.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12407&quot; data-start=&quot;12397&quot;&gt;
&lt;p data-end=&quot;12407&quot; data-start=&quot;12399&quot;&gt;Ekuitas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;12412&quot; data-start=&quot;12409&quot; /&gt;
&lt;h2 data-end=&quot;12442&quot; data-start=&quot;12414&quot;&gt;3.6 Audit Trail &amp;amp; Logging&lt;/h2&gt;
&lt;h3 data-end=&quot;12466&quot; data-start=&quot;12444&quot;&gt;FR-090 – Audit Log&lt;/h3&gt;
&lt;ul data-end=&quot;12775&quot; data-start=&quot;12467&quot;&gt;
&lt;li data-end=&quot;12622&quot; data-start=&quot;12467&quot;&gt;
&lt;p data-end=&quot;12508&quot; data-start=&quot;12469&quot;&gt;Sistem mencatat setiap operasi penting:&lt;/p&gt;
&lt;ul data-end=&quot;12622&quot; data-start=&quot;12511&quot;&gt;
&lt;li data-end=&quot;12526&quot; data-start=&quot;12511&quot;&gt;
&lt;p data-end=&quot;12526&quot; data-start=&quot;12513&quot;&gt;Login/Logout.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12622&quot; data-start=&quot;12529&quot;&gt;
&lt;p data-end=&quot;12622&quot; data-start=&quot;12531&quot;&gt;Create/Update/Delete pada master dan transaksi (Customer, Vendor, SO, PO, Invoice, Jurnal).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12775&quot; data-start=&quot;12623&quot;&gt;
&lt;p data-end=&quot;12639&quot; data-start=&quot;12625&quot;&gt;Informasi log:&lt;/p&gt;
&lt;ul data-end=&quot;12775&quot; data-start=&quot;12642&quot;&gt;
&lt;li data-end=&quot;12654&quot; data-start=&quot;12642&quot;&gt;
&lt;p data-end=&quot;12654&quot; data-start=&quot;12644&quot;&gt;Timestamp.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12664&quot; data-start=&quot;12657&quot;&gt;
&lt;p data-end=&quot;12664&quot; data-start=&quot;12659&quot;&gt;User.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12683&quot; data-start=&quot;12667&quot;&gt;
&lt;p data-end=&quot;12683&quot; data-start=&quot;12669&quot;&gt;Jenis operasi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12707&quot; data-start=&quot;12686&quot;&gt;
&lt;p data-end=&quot;12707&quot; data-start=&quot;12688&quot;&gt;Objek (jenis &amp;amp; ID).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12775&quot; data-start=&quot;12710&quot;&gt;
&lt;p data-end=&quot;12775&quot; data-start=&quot;12712&quot;&gt;Ringkasan perubahan (sebelum / sesudah, minimal field penting).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;12809&quot; data-start=&quot;12777&quot;&gt;FR-091 – History Per Dokumen&lt;/h3&gt;
&lt;ul data-end=&quot;12962&quot; data-start=&quot;12810&quot;&gt;
&lt;li data-end=&quot;12962&quot; data-start=&quot;12810&quot;&gt;
&lt;p data-end=&quot;12894&quot; data-start=&quot;12812&quot;&gt;Di layar detail dokumen (SO, PO, Invoice) terdapat tab “History” yang menampilkan:&lt;/p&gt;
&lt;ul data-end=&quot;12962&quot; data-start=&quot;12897&quot;&gt;
&lt;li data-end=&quot;12916&quot; data-start=&quot;12897&quot;&gt;
&lt;p data-end=&quot;12916&quot; data-start=&quot;12899&quot;&gt;Perubahan status.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12941&quot; data-start=&quot;12919&quot;&gt;
&lt;p data-end=&quot;12941&quot; data-start=&quot;12921&quot;&gt;User yang melakukan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;12962&quot; data-start=&quot;12944&quot;&gt;
&lt;p data-end=&quot;12962&quot; data-start=&quot;12946&quot;&gt;Tanggal &amp;amp; waktu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;12967&quot; data-start=&quot;12964&quot; /&gt;
&lt;h2 data-end=&quot;12993&quot; data-start=&quot;12969&quot;&gt;3.7 Pengaturan Sistem&lt;/h2&gt;
&lt;h3 data-end=&quot;13024&quot; data-start=&quot;12995&quot;&gt;FR-100 – Konfigurasi Umum&lt;/h3&gt;
&lt;ul data-end=&quot;13266&quot; data-start=&quot;13025&quot;&gt;
&lt;li data-end=&quot;13266&quot; data-start=&quot;13025&quot;&gt;
&lt;p data-end=&quot;13048&quot; data-start=&quot;13027&quot;&gt;Admin dapat mengatur:&lt;/p&gt;
&lt;ul data-end=&quot;13266&quot; data-start=&quot;13051&quot;&gt;
&lt;li data-end=&quot;13069&quot; data-start=&quot;13051&quot;&gt;
&lt;p data-end=&quot;13069&quot; data-start=&quot;13053&quot;&gt;Nama perusahaan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13090&quot; data-start=&quot;13072&quot;&gt;
&lt;p data-end=&quot;13090&quot; data-start=&quot;13074&quot;&gt;Logo perusahaan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13113&quot; data-start=&quot;13093&quot;&gt;
&lt;p data-end=&quot;13113&quot; data-start=&quot;13095&quot;&gt;Mata uang default.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13168&quot; data-start=&quot;13116&quot;&gt;
&lt;p data-end=&quot;13168&quot; data-start=&quot;13118&quot;&gt;Format penomoran dokumen (prefix, running number).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13204&quot; data-start=&quot;13171&quot;&gt;
&lt;p data-end=&quot;13204&quot; data-start=&quot;13173&quot;&gt;Pajak default (persentase PPN).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13266&quot; data-start=&quot;13207&quot;&gt;
&lt;p data-end=&quot;13266&quot; data-start=&quot;13209&quot;&gt;Kebijakan keamanan (expired password, lock account, dsb).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;13271&quot; data-start=&quot;13268&quot; /&gt;
&lt;h1 data-end=&quot;13302&quot; data-start=&quot;13273&quot;&gt;4. Kebutuhan Non-Fungsional&lt;/h1&gt;
&lt;h2 data-end=&quot;13320&quot; data-start=&quot;13304&quot;&gt;4.1 Usability&lt;/h2&gt;
&lt;h3 data-end=&quot;13348&quot; data-start=&quot;13322&quot;&gt;NFR-001 – UI Konsisten&lt;/h3&gt;
&lt;ul data-end=&quot;13530&quot; data-start=&quot;13349&quot;&gt;
&lt;li data-end=&quot;13452&quot; data-start=&quot;13349&quot;&gt;
&lt;p data-end=&quot;13406&quot; data-start=&quot;13351&quot;&gt;UI menggunakan komponen &lt;strong data-end=&quot;13388&quot; data-start=&quot;13375&quot;&gt;Bootstrap&lt;/strong&gt; secara konsisten:&lt;/p&gt;
&lt;ul data-end=&quot;13452&quot; data-start=&quot;13409&quot;&gt;
&lt;li data-end=&quot;13452&quot; data-start=&quot;13409&quot;&gt;
&lt;p data-end=&quot;13452&quot; data-start=&quot;13411&quot;&gt;Navbar, card, table, form, button, modal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13530&quot; data-start=&quot;13453&quot;&gt;
&lt;p data-end=&quot;13530&quot; data-start=&quot;13455&quot;&gt;Warna dan tipografi mengikuti tema perusahaan (bisa diatur via CSS custom).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;13563&quot; data-start=&quot;13532&quot;&gt;NFR-002 – Responsive Design&lt;/h3&gt;
&lt;ul data-end=&quot;13685&quot; data-start=&quot;13564&quot;&gt;
&lt;li data-end=&quot;13633&quot; data-start=&quot;13564&quot;&gt;
&lt;p data-end=&quot;13633&quot; data-start=&quot;13566&quot;&gt;Tampilan bisa diakses dengan nyaman dari desktop/laptop dan tablet.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13685&quot; data-start=&quot;13634&quot;&gt;
&lt;p data-end=&quot;13685&quot; data-start=&quot;13636&quot;&gt;Minimal resolusi desktop 1366x768 didukung penuh.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;13719&quot; data-start=&quot;13687&quot;&gt;NFR-003 – Navigasi Sederhana&lt;/h3&gt;
&lt;ul data-end=&quot;13865&quot; data-start=&quot;13720&quot;&gt;
&lt;li data-end=&quot;13798&quot; data-start=&quot;13720&quot;&gt;
&lt;p data-end=&quot;13733&quot; data-start=&quot;13722&quot;&gt;Menu utama:&lt;/p&gt;
&lt;ul data-end=&quot;13798&quot; data-start=&quot;13736&quot;&gt;
&lt;li data-end=&quot;13747&quot; data-start=&quot;13736&quot;&gt;
&lt;p data-end=&quot;13747&quot; data-start=&quot;13738&quot;&gt;Dashboard&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13757&quot; data-start=&quot;13750&quot;&gt;
&lt;p data-end=&quot;13757&quot; data-start=&quot;13752&quot;&gt;Sales&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13770&quot; data-start=&quot;13760&quot;&gt;
&lt;p data-end=&quot;13770&quot; data-start=&quot;13762&quot;&gt;Purchase&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13785&quot; data-start=&quot;13773&quot;&gt;
&lt;p data-end=&quot;13785&quot; data-start=&quot;13775&quot;&gt;Accounting&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13798&quot; data-start=&quot;13788&quot;&gt;
&lt;p data-end=&quot;13798&quot; data-start=&quot;13790&quot;&gt;Settings&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;13865&quot; data-start=&quot;13799&quot;&gt;
&lt;p data-end=&quot;13865&quot; data-start=&quot;13801&quot;&gt;Breadcrumbs untuk membantu user memahami posisi di dalam sistem.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;13905&quot; data-start=&quot;13867&quot;&gt;NFR-004 – Validasi Form yang Jelas&lt;/h3&gt;
&lt;ul data-end=&quot;14065&quot; data-start=&quot;13906&quot;&gt;
&lt;li data-end=&quot;13968&quot; data-start=&quot;13906&quot;&gt;
&lt;p data-end=&quot;13968&quot; data-start=&quot;13908&quot;&gt;Validasi front-end (HTML5 + JS) dan back-end (Django forms).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14020&quot; data-start=&quot;13969&quot;&gt;
&lt;p data-end=&quot;14020&quot; data-start=&quot;13971&quot;&gt;Pesan error jelas dan dekat dengan field terkait.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14065&quot; data-start=&quot;14021&quot;&gt;
&lt;p data-end=&quot;14065&quot; data-start=&quot;14023&quot;&gt;Field wajib diisi ditandai (mis. tanda *).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;14070&quot; data-start=&quot;14067&quot; /&gt;
&lt;h2 data-end=&quot;14087&quot; data-start=&quot;14072&quot;&gt;4.2 Keamanan&lt;/h2&gt;
&lt;h3 data-end=&quot;14119&quot; data-start=&quot;14089&quot;&gt;NFR-010 – Autentikasi Aman&lt;/h3&gt;
&lt;ul data-end=&quot;14289&quot; data-start=&quot;14120&quot;&gt;
&lt;li data-end=&quot;14222&quot; data-start=&quot;14120&quot;&gt;
&lt;p data-end=&quot;14222&quot; data-start=&quot;14122&quot;&gt;Password disimpan menggunakan algoritma hash yang kuat (mis. PBKDF2, Argon2 atau bcrypt via Django).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14289&quot; data-start=&quot;14223&quot;&gt;
&lt;p data-end=&quot;14289&quot; data-start=&quot;14225&quot;&gt;Wajib gunakan HTTPS pada lingkungan produksi (config di server).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;14318&quot; data-start=&quot;14291&quot;&gt;NFR-011 – Proteksi CSRF&lt;/h3&gt;
&lt;ul data-end=&quot;14419&quot; data-start=&quot;14319&quot;&gt;
&lt;li data-end=&quot;14419&quot; data-start=&quot;14319&quot;&gt;
&lt;p data-end=&quot;14419&quot; data-start=&quot;14321&quot;&gt;Setiap form yang memodifikasi data harus menggunakan CSRF token (built-in Django CSRF protection).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;14463&quot; data-start=&quot;14421&quot;&gt;NFR-012 – Proteksi XSS &amp;amp; SQL Injection&lt;/h3&gt;
&lt;ul data-end=&quot;14705&quot; data-start=&quot;14464&quot;&gt;
&lt;li data-end=&quot;14509&quot; data-start=&quot;14464&quot;&gt;
&lt;p data-end=&quot;14509&quot; data-start=&quot;14466&quot;&gt;Semua input user divalidasi dan disanitasi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14627&quot; data-start=&quot;14510&quot;&gt;
&lt;p data-end=&quot;14525&quot; data-start=&quot;14512&quot;&gt;Mengandalkan:&lt;/p&gt;
&lt;ul data-end=&quot;14627&quot; data-start=&quot;14528&quot;&gt;
&lt;li data-end=&quot;14594&quot; data-start=&quot;14528&quot;&gt;
&lt;p data-end=&quot;14594&quot; data-start=&quot;14530&quot;&gt;ORM Django untuk query database (menghindari raw SQL unescaped).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14627&quot; data-start=&quot;14597&quot;&gt;
&lt;p data-end=&quot;14627&quot; data-start=&quot;14599&quot;&gt;Auto-escaping pada template.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14705&quot; data-start=&quot;14628&quot;&gt;
&lt;p data-end=&quot;14705&quot; data-start=&quot;14630&quot;&gt;Tidak mem-parse input sebagai HTML kecuali betul-betul diperlukan dan aman.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;14746&quot; data-start=&quot;14707&quot;&gt;NFR-013 – Role-Based Access Control&lt;/h3&gt;
&lt;ul data-end=&quot;14899&quot; data-start=&quot;14747&quot;&gt;
&lt;li data-end=&quot;14802&quot; data-start=&quot;14747&quot;&gt;
&lt;p data-end=&quot;14802&quot; data-start=&quot;14749&quot;&gt;Setiap request dicek permission-nya berdasarkan role.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;14899&quot; data-start=&quot;14803&quot;&gt;
&lt;p data-end=&quot;14899&quot; data-start=&quot;14805&quot;&gt;Endpoint dan view yang tidak berhak harus memunculkan error 403 atau redirect ke halaman lain.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;14933&quot; data-start=&quot;14901&quot;&gt;NFR-014 – Session Management&lt;/h3&gt;
&lt;ul data-end=&quot;15160&quot; data-start=&quot;14934&quot;&gt;
&lt;li data-end=&quot;14995&quot; data-start=&quot;14934&quot;&gt;
&lt;p data-end=&quot;14995&quot; data-start=&quot;14936&quot;&gt;Session timeout setelah X menit tidak aktif (configurable).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15065&quot; data-start=&quot;14996&quot;&gt;
&lt;p data-end=&quot;15025&quot; data-start=&quot;14998&quot;&gt;Cookie session diberi flag:&lt;/p&gt;
&lt;ul data-end=&quot;15065&quot; data-start=&quot;15028&quot;&gt;
&lt;li data-end=&quot;15039&quot; data-start=&quot;15028&quot;&gt;
&lt;p data-end=&quot;15039&quot; data-start=&quot;15030&quot;&gt;HttpOnly.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15065&quot; data-start=&quot;15042&quot;&gt;
&lt;p data-end=&quot;15065&quot; data-start=&quot;15044&quot;&gt;Secure (di produksi).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15160&quot; data-start=&quot;15066&quot;&gt;
&lt;p data-end=&quot;15160&quot; data-start=&quot;15068&quot;&gt;Jika user logout atau password direset, session yang berjalan dapat diinvalidasi (opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;15200&quot; data-start=&quot;15162&quot;&gt;NFR-015 – Audit &amp;amp; Logging Keamanan&lt;/h3&gt;
&lt;ul data-end=&quot;15327&quot; data-start=&quot;15201&quot;&gt;
&lt;li data-end=&quot;15277&quot; data-start=&quot;15201&quot;&gt;
&lt;p data-end=&quot;15214&quot; data-start=&quot;15203&quot;&gt;Pencatatan:&lt;/p&gt;
&lt;ul data-end=&quot;15277&quot; data-start=&quot;15217&quot;&gt;
&lt;li data-end=&quot;15241&quot; data-start=&quot;15217&quot;&gt;
&lt;p data-end=&quot;15241&quot; data-start=&quot;15219&quot;&gt;Percobaan login gagal.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15277&quot; data-start=&quot;15244&quot;&gt;
&lt;p data-end=&quot;15277&quot; data-start=&quot;15246&quot;&gt;Perubahan konfigurasi keamanan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15327&quot; data-start=&quot;15278&quot;&gt;
&lt;p data-end=&quot;15327&quot; data-start=&quot;15280&quot;&gt;Log disimpan di table khusus dan/atau file log.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;15332&quot; data-start=&quot;15329&quot; /&gt;
&lt;h2 data-end=&quot;15362&quot; data-start=&quot;15334&quot;&gt;4.3 Kinerja (Performance)&lt;/h2&gt;
&lt;h3 data-end=&quot;15391&quot; data-start=&quot;15364&quot;&gt;NFR-020 – Respons Wajar&lt;/h3&gt;
&lt;ul data-end=&quot;15628&quot; data-start=&quot;15392&quot;&gt;
&lt;li data-end=&quot;15518&quot; data-start=&quot;15392&quot;&gt;
&lt;p data-end=&quot;15453&quot; data-start=&quot;15394&quot;&gt;Untuk beban normal (mis. hingga 50 user konkuren internal):&lt;/p&gt;
&lt;ul data-end=&quot;15518&quot; data-start=&quot;15456&quot;&gt;
&lt;li data-end=&quot;15518&quot; data-start=&quot;15456&quot;&gt;
&lt;p data-end=&quot;15518&quot; data-start=&quot;15458&quot;&gt;95% request halaman utama dan form harus merespon &amp;lt; 3 detik.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15628&quot; data-start=&quot;15519&quot;&gt;
&lt;p data-end=&quot;15628&quot; data-start=&quot;15521&quot;&gt;Query database dioptimasi melalui index pada kolom-kolom kunci (id, tanggal dokumen, customer/vendor, dll).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;15633&quot; data-start=&quot;15630&quot; /&gt;
&lt;h2 data-end=&quot;15669&quot; data-start=&quot;15635&quot;&gt;4.4 Reliabilitas &amp;amp; Ketersediaan&lt;/h2&gt;
&lt;h3 data-end=&quot;15691&quot; data-start=&quot;15671&quot;&gt;NFR-030 – Backup&lt;/h3&gt;
&lt;ul data-end=&quot;15884&quot; data-start=&quot;15692&quot;&gt;
&lt;li data-end=&quot;15843&quot; data-start=&quot;15692&quot;&gt;
&lt;p data-end=&quot;15776&quot; data-start=&quot;15694&quot;&gt;Sistem harus memiliki mekanisme backup database (di level infrastruktur/prosedur):&lt;/p&gt;
&lt;ul data-end=&quot;15843&quot; data-start=&quot;15779&quot;&gt;
&lt;li data-end=&quot;15843&quot; data-start=&quot;15779&quot;&gt;
&lt;p data-end=&quot;15843&quot; data-start=&quot;15781&quot;&gt;Backup harian (minimal) dengan retensi sejumlah hari tertentu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;15884&quot; data-start=&quot;15844&quot;&gt;
&lt;p data-end=&quot;15884&quot; data-start=&quot;15846&quot;&gt;Dokumentasi prosedur restore database.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;15915&quot; data-start=&quot;15886&quot;&gt;NFR-031 – Integritas Data&lt;/h3&gt;
&lt;ul data-end=&quot;16068&quot; data-start=&quot;15916&quot;&gt;
&lt;li data-end=&quot;16068&quot; data-start=&quot;15916&quot;&gt;
&lt;p data-end=&quot;16010&quot; data-start=&quot;15918&quot;&gt;Transaksi penting (invoice, jurnal, posting) harus menggunakan transaction/atomic di Django:&lt;/p&gt;
&lt;ul data-end=&quot;16068&quot; data-start=&quot;16013&quot;&gt;
&lt;li data-end=&quot;16068&quot; data-start=&quot;16013&quot;&gt;
&lt;p data-end=&quot;16068&quot; data-start=&quot;16015&quot;&gt;Jika satu bagian gagal, seluruh transaksi dibatalkan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;16073&quot; data-start=&quot;16070&quot; /&gt;
&lt;h2 data-end=&quot;16113&quot; data-start=&quot;16075&quot;&gt;4.5 Maintainability &amp;amp; Extensibility&lt;/h2&gt;
&lt;h3 data-end=&quot;16148&quot; data-start=&quot;16115&quot;&gt;NFR-040 – Struktur Kode Jelas&lt;/h3&gt;
&lt;ul data-end=&quot;16308&quot; data-start=&quot;16149&quot;&gt;
&lt;li data-end=&quot;16308&quot; data-start=&quot;16149&quot;&gt;
&lt;p data-end=&quot;16173&quot; data-start=&quot;16151&quot;&gt;Kode Django mengikuti:&lt;/p&gt;
&lt;ul data-end=&quot;16308&quot; data-start=&quot;16176&quot;&gt;
&lt;li data-end=&quot;16245&quot; data-start=&quot;16176&quot;&gt;
&lt;p data-end=&quot;16245&quot; data-start=&quot;16178&quot;&gt;Konsep apps per modul (sales, purchase, accounting, core/settings).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;16308&quot; data-start=&quot;16248&quot;&gt;
&lt;p data-end=&quot;16308&quot; data-start=&quot;16250&quot;&gt;Pemisahan models, views, forms, templates, urls, services.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;16335&quot; data-start=&quot;16310&quot;&gt;NFR-041 – Dokumentasi&lt;/h3&gt;
&lt;ul data-end=&quot;16473&quot; data-start=&quot;16336&quot;&gt;
&lt;li data-end=&quot;16473&quot; data-start=&quot;16336&quot;&gt;
&lt;p data-end=&quot;16361&quot; data-start=&quot;16338&quot;&gt;Disediakan dokumentasi:&lt;/p&gt;
&lt;ul data-end=&quot;16473&quot; data-start=&quot;16364&quot;&gt;
&lt;li data-end=&quot;16390&quot; data-start=&quot;16364&quot;&gt;
&lt;p data-end=&quot;16390&quot; data-start=&quot;16366&quot;&gt;Struktur database utama.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;16442&quot; data-start=&quot;16393&quot;&gt;
&lt;p data-end=&quot;16442&quot; data-start=&quot;16395&quot;&gt;Flow utama modul (Sales, Purchase, Accounting).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;16473&quot; data-start=&quot;16445&quot;&gt;
&lt;p data-end=&quot;16473&quot; data-start=&quot;16447&quot;&gt;Cara deploy &amp;amp; konfigurasi.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;16478&quot; data-start=&quot;16475&quot; /&gt;
&lt;h2 data-end=&quot;16499&quot; data-start=&quot;16480&quot;&gt;4.6 Portabilitas&lt;/h2&gt;
&lt;h3 data-end=&quot;16523&quot; data-start=&quot;16501&quot;&gt;NFR-050 – Platform&lt;/h3&gt;
&lt;ul data-end=&quot;16661&quot; data-start=&quot;16524&quot;&gt;
&lt;li data-end=&quot;16631&quot; data-start=&quot;16524&quot;&gt;
&lt;p data-end=&quot;16553&quot; data-start=&quot;16526&quot;&gt;Aplikasi dapat berjalan di:&lt;/p&gt;
&lt;ul data-end=&quot;16631&quot; data-start=&quot;16556&quot;&gt;
&lt;li data-end=&quot;16584&quot; data-start=&quot;16556&quot;&gt;
&lt;p data-end=&quot;16584&quot; data-start=&quot;16558&quot;&gt;Server Linux (disarankan).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;16631&quot; data-start=&quot;16587&quot;&gt;
&lt;p data-end=&quot;16631&quot; data-start=&quot;16589&quot;&gt;Web server: gunicorn/uwsgi + Nginx/Apache.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;16661&quot; data-start=&quot;16632&quot;&gt;
&lt;p data-end=&quot;16661&quot; data-start=&quot;16634&quot;&gt;MySQL 5.7+ / MariaDB 10.3+.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;16666&quot; data-start=&quot;16663&quot; /&gt;
&lt;h1 data-end=&quot;16695&quot; data-start=&quot;16668&quot;&gt;5. Model Data (Ringkasan)&lt;/h1&gt;
&lt;blockquote data-end=&quot;16775&quot; data-start=&quot;16697&quot;&gt;
&lt;p data-end=&quot;16775&quot; data-start=&quot;16699&quot;&gt;Ini ringkasan entitas utama (tidak full ERD, tapi cukup sebagai acuan awal).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;16797&quot; data-start=&quot;16777&quot;&gt;5.1 Entitas Utama&lt;/h2&gt;
&lt;ul data-end=&quot;18496&quot; data-start=&quot;16799&quot;&gt;
&lt;li data-end=&quot;16892&quot; data-start=&quot;16799&quot;&gt;
&lt;p data-end=&quot;16809&quot; data-start=&quot;16801&quot;&gt;&lt;strong data-end=&quot;16809&quot; data-start=&quot;16801&quot;&gt;User&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;16892&quot; data-start=&quot;16812&quot;&gt;
&lt;li data-end=&quot;16892&quot; data-start=&quot;16812&quot;&gt;
&lt;p data-end=&quot;16892&quot; data-start=&quot;16814&quot;&gt;id, username, password_hash, email, role_id, is_active, created_at, updated_at&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;16929&quot; data-start=&quot;16893&quot;&gt;
&lt;p data-end=&quot;16903&quot; data-start=&quot;16895&quot;&gt;&lt;strong data-end=&quot;16903&quot; data-start=&quot;16895&quot;&gt;Role&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;16929&quot; data-start=&quot;16906&quot;&gt;
&lt;li data-end=&quot;16929&quot; data-start=&quot;16906&quot;&gt;
&lt;p data-end=&quot;16929&quot; data-start=&quot;16908&quot;&gt;id, name, description&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17013&quot; data-start=&quot;16930&quot;&gt;
&lt;p data-end=&quot;16944&quot; data-start=&quot;16932&quot;&gt;&lt;strong data-end=&quot;16944&quot; data-start=&quot;16932&quot;&gt;Customer&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17013&quot; data-start=&quot;16947&quot;&gt;
&lt;li data-end=&quot;17013&quot; data-start=&quot;16947&quot;&gt;
&lt;p data-end=&quot;17013&quot; data-start=&quot;16949&quot;&gt;id, kode, nama, alamat, phone, email, npwp, term_payment, status&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17095&quot; data-start=&quot;17014&quot;&gt;
&lt;p data-end=&quot;17026&quot; data-start=&quot;17016&quot;&gt;&lt;strong data-end=&quot;17026&quot; data-start=&quot;17016&quot;&gt;Vendor&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17095&quot; data-start=&quot;17029&quot;&gt;
&lt;li data-end=&quot;17095&quot; data-start=&quot;17029&quot;&gt;
&lt;p data-end=&quot;17095&quot; data-start=&quot;17031&quot;&gt;id, kode, nama, alamat, phone, email, npwp, term_payment, status&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17194&quot; data-start=&quot;17096&quot;&gt;
&lt;p data-end=&quot;17109&quot; data-start=&quot;17098&quot;&gt;&lt;strong data-end=&quot;17109&quot; data-start=&quot;17098&quot;&gt;Product&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17194&quot; data-start=&quot;17112&quot;&gt;
&lt;li data-end=&quot;17194&quot; data-start=&quot;17112&quot;&gt;
&lt;p data-end=&quot;17194&quot; data-start=&quot;17114&quot;&gt;id, kode, nama, kategori, satuan, harga_jual_default, harga_beli_default, status&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17277&quot; data-start=&quot;17195&quot;&gt;
&lt;p data-end=&quot;17210&quot; data-start=&quot;17197&quot;&gt;&lt;strong data-end=&quot;17210&quot; data-start=&quot;17197&quot;&gt;Quotation&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17277&quot; data-start=&quot;17213&quot;&gt;
&lt;li data-end=&quot;17277&quot; data-start=&quot;17213&quot;&gt;
&lt;p data-end=&quot;17277&quot; data-start=&quot;17215&quot;&gt;id, nomor, customer_id, tanggal, status, total, user_id, terms&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17357&quot; data-start=&quot;17278&quot;&gt;
&lt;p data-end=&quot;17297&quot; data-start=&quot;17280&quot;&gt;&lt;strong data-end=&quot;17297&quot; data-start=&quot;17280&quot;&gt;QuotationLine&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17357&quot; data-start=&quot;17300&quot;&gt;
&lt;li data-end=&quot;17357&quot; data-start=&quot;17300&quot;&gt;
&lt;p data-end=&quot;17357&quot; data-start=&quot;17302&quot;&gt;id, quotation_id, product_id, qty, harga, diskon, pajak&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17467&quot; data-start=&quot;17358&quot;&gt;
&lt;p data-end=&quot;17379&quot; data-start=&quot;17360&quot;&gt;&lt;strong data-end=&quot;17379&quot; data-start=&quot;17360&quot;&gt;SalesOrder (SO)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17467&quot; data-start=&quot;17382&quot;&gt;
&lt;li data-end=&quot;17467&quot; data-start=&quot;17382&quot;&gt;
&lt;p data-end=&quot;17467&quot; data-start=&quot;17384&quot;&gt;id, nomor, customer_id, tanggal, status, total, user_id, terms, referensi_quotation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17541&quot; data-start=&quot;17468&quot;&gt;
&lt;p data-end=&quot;17488&quot; data-start=&quot;17470&quot;&gt;&lt;strong data-end=&quot;17488&quot; data-start=&quot;17470&quot;&gt;SalesOrderLine&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17541&quot; data-start=&quot;17491&quot;&gt;
&lt;li data-end=&quot;17541&quot; data-start=&quot;17491&quot;&gt;
&lt;p data-end=&quot;17541&quot; data-start=&quot;17493&quot;&gt;id, so_id, product_id, qty, harga, diskon, pajak&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17631&quot; data-start=&quot;17542&quot;&gt;
&lt;p data-end=&quot;17566&quot; data-start=&quot;17544&quot;&gt;&lt;strong data-end=&quot;17566&quot; data-start=&quot;17544&quot;&gt;PurchaseOrder (PO)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17631&quot; data-start=&quot;17569&quot;&gt;
&lt;li data-end=&quot;17631&quot; data-start=&quot;17569&quot;&gt;
&lt;p data-end=&quot;17631&quot; data-start=&quot;17571&quot;&gt;id, nomor, vendor_id, tanggal, status, total, user_id, terms&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17708&quot; data-start=&quot;17632&quot;&gt;
&lt;p data-end=&quot;17655&quot; data-start=&quot;17634&quot;&gt;&lt;strong data-end=&quot;17655&quot; data-start=&quot;17634&quot;&gt;PurchaseOrderLine&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17708&quot; data-start=&quot;17658&quot;&gt;
&lt;li data-end=&quot;17708&quot; data-start=&quot;17658&quot;&gt;
&lt;p data-end=&quot;17708&quot; data-start=&quot;17660&quot;&gt;id, po_id, product_id, qty, harga, diskon, pajak&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17849&quot; data-start=&quot;17709&quot;&gt;
&lt;p data-end=&quot;17722&quot; data-start=&quot;17711&quot;&gt;&lt;strong data-end=&quot;17722&quot; data-start=&quot;17711&quot;&gt;Invoice&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17849&quot; data-start=&quot;17725&quot;&gt;
&lt;li data-end=&quot;17849&quot; data-start=&quot;17725&quot;&gt;
&lt;p data-end=&quot;17849&quot; data-start=&quot;17727&quot;&gt;id, nomor, tipe (sales/purchase), partner_type (customer/vendor), partner_id, tanggal, due_date, status, total, journal_id&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;17945&quot; data-start=&quot;17850&quot;&gt;
&lt;p data-end=&quot;17867&quot; data-start=&quot;17852&quot;&gt;&lt;strong data-end=&quot;17867&quot; data-start=&quot;17852&quot;&gt;InvoiceLine&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;17945&quot; data-start=&quot;17870&quot;&gt;
&lt;li data-end=&quot;17945&quot; data-start=&quot;17870&quot;&gt;
&lt;p data-end=&quot;17945&quot; data-start=&quot;17872&quot;&gt;id, invoice_id, product_id, qty, harga, pajak, akun_pendapatan/akun_beban&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18001&quot; data-start=&quot;17946&quot;&gt;
&lt;p data-end=&quot;17965&quot; data-start=&quot;17948&quot;&gt;&lt;strong data-end=&quot;17965&quot; data-start=&quot;17948&quot;&gt;Account (CoA)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;18001&quot; data-start=&quot;17968&quot;&gt;
&lt;li data-end=&quot;18001&quot; data-start=&quot;17968&quot;&gt;
&lt;p data-end=&quot;18001&quot; data-start=&quot;17970&quot;&gt;id, kode, nama, tipe, is_active&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18081&quot; data-start=&quot;18002&quot;&gt;
&lt;p data-end=&quot;18015&quot; data-start=&quot;18004&quot;&gt;&lt;strong data-end=&quot;18015&quot; data-start=&quot;18004&quot;&gt;Journal&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;18081&quot; data-start=&quot;18018&quot;&gt;
&lt;li data-end=&quot;18081&quot; data-start=&quot;18018&quot;&gt;
&lt;p data-end=&quot;18081&quot; data-start=&quot;18020&quot;&gt;id, kode, nama, tipe, akun_debit_default, akun_kredit_default&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18184&quot; data-start=&quot;18082&quot;&gt;
&lt;p data-end=&quot;18109&quot; data-start=&quot;18084&quot;&gt;&lt;strong data-end=&quot;18109&quot; data-start=&quot;18084&quot;&gt;JournalEntry (Header)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;18184&quot; data-start=&quot;18112&quot;&gt;
&lt;li data-end=&quot;18184&quot; data-start=&quot;18112&quot;&gt;
&lt;p data-end=&quot;18184&quot; data-start=&quot;18114&quot;&gt;id, nomor, tanggal, journal_id, ref, status (draft/posted), created_by&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18273&quot; data-start=&quot;18185&quot;&gt;
&lt;p data-end=&quot;18209&quot; data-start=&quot;18187&quot;&gt;&lt;strong data-end=&quot;18209&quot; data-start=&quot;18187&quot;&gt;JournalItem (Line)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;18273&quot; data-start=&quot;18212&quot;&gt;
&lt;li data-end=&quot;18273&quot; data-start=&quot;18212&quot;&gt;
&lt;p data-end=&quot;18273&quot; data-start=&quot;18214&quot;&gt;id, journal_entry_id, account_id, debit, kredit, keterangan&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18385&quot; data-start=&quot;18274&quot;&gt;
&lt;p data-end=&quot;18287&quot; data-start=&quot;18276&quot;&gt;&lt;strong data-end=&quot;18287&quot; data-start=&quot;18276&quot;&gt;Payment&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;18385&quot; data-start=&quot;18290&quot;&gt;
&lt;li data-end=&quot;18385&quot; data-start=&quot;18290&quot;&gt;
&lt;p data-end=&quot;18385&quot; data-start=&quot;18292&quot;&gt;id, nomor, tanggal, tipe (inbound/outbound), amount, metode, rekening, partner_id, invoice_id&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18496&quot; data-start=&quot;18386&quot;&gt;
&lt;p data-end=&quot;18400&quot; data-start=&quot;18388&quot;&gt;&lt;strong data-end=&quot;18400&quot; data-start=&quot;18388&quot;&gt;AuditLog&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;18496&quot; data-start=&quot;18403&quot;&gt;
&lt;li data-end=&quot;18496&quot; data-start=&quot;18403&quot;&gt;
&lt;p data-end=&quot;18496&quot; data-start=&quot;18405&quot;&gt;id, user_id, timestamp, action, object_type, object_id, before_data, after_data, ip_address&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;18501&quot; data-start=&quot;18498&quot; /&gt;
&lt;h1 data-end=&quot;18539&quot; data-start=&quot;18503&quot;&gt;6. Antarmuka Pengguna (High-Level)&lt;/h1&gt;
&lt;h2 data-end=&quot;18561&quot; data-start=&quot;18541&quot;&gt;6.1 Layout Global&lt;/h2&gt;
&lt;ul data-end=&quot;19061&quot; data-start=&quot;18563&quot;&gt;
&lt;li data-end=&quot;18667&quot; data-start=&quot;18563&quot;&gt;
&lt;p data-end=&quot;18580&quot; data-start=&quot;18565&quot;&gt;&lt;strong data-end=&quot;18579&quot; data-start=&quot;18565&quot;&gt;Top Navbar&lt;/strong&gt;:&lt;/p&gt;
&lt;ul data-end=&quot;18667&quot; data-start=&quot;18583&quot;&gt;
&lt;li data-end=&quot;18601&quot; data-start=&quot;18583&quot;&gt;
&lt;p data-end=&quot;18601&quot; data-start=&quot;18585&quot;&gt;Logo perusahaan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18620&quot; data-start=&quot;18604&quot;&gt;
&lt;p data-end=&quot;18620&quot; data-start=&quot;18606&quot;&gt;Nama aplikasi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18667&quot; data-start=&quot;18623&quot;&gt;
&lt;p data-end=&quot;18667&quot; data-start=&quot;18625&quot;&gt;Menu user (profil, ubah password, logout).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19061&quot; data-start=&quot;18668&quot;&gt;
&lt;p data-end=&quot;18687&quot; data-start=&quot;18670&quot;&gt;&lt;strong data-end=&quot;18686&quot; data-start=&quot;18670&quot;&gt;Sidebar Menu&lt;/strong&gt;:&lt;/p&gt;
&lt;ul data-end=&quot;19061&quot; data-start=&quot;18690&quot;&gt;
&lt;li data-end=&quot;18701&quot; data-start=&quot;18690&quot;&gt;
&lt;p data-end=&quot;18701&quot; data-start=&quot;18692&quot;&gt;Dashboard&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18793&quot; data-start=&quot;18704&quot;&gt;
&lt;p data-end=&quot;18711&quot; data-start=&quot;18706&quot;&gt;Sales&lt;/p&gt;
&lt;ul data-end=&quot;18793&quot; data-start=&quot;18716&quot;&gt;
&lt;li data-end=&quot;18727&quot; data-start=&quot;18716&quot;&gt;
&lt;p data-end=&quot;18727&quot; data-start=&quot;18718&quot;&gt;Customers&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18742&quot; data-start=&quot;18732&quot;&gt;
&lt;p data-end=&quot;18742&quot; data-start=&quot;18734&quot;&gt;Products&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18759&quot; data-start=&quot;18747&quot;&gt;
&lt;p data-end=&quot;18759&quot; data-start=&quot;18749&quot;&gt;Quotations&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18778&quot; data-start=&quot;18764&quot;&gt;
&lt;p data-end=&quot;18778&quot; data-start=&quot;18766&quot;&gt;Sales Orders&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18793&quot; data-start=&quot;18783&quot;&gt;
&lt;p data-end=&quot;18793&quot; data-start=&quot;18785&quot;&gt;Invoices&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18857&quot; data-start=&quot;18796&quot;&gt;
&lt;p data-end=&quot;18806&quot; data-start=&quot;18798&quot;&gt;Purchase&lt;/p&gt;
&lt;ul data-end=&quot;18857&quot; data-start=&quot;18811&quot;&gt;
&lt;li data-end=&quot;18820&quot; data-start=&quot;18811&quot;&gt;
&lt;p data-end=&quot;18820&quot; data-start=&quot;18813&quot;&gt;Vendors&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18842&quot; data-start=&quot;18825&quot;&gt;
&lt;p data-end=&quot;18842&quot; data-start=&quot;18827&quot;&gt;Purchase Orders&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18857&quot; data-start=&quot;18847&quot;&gt;
&lt;p data-end=&quot;18857&quot; data-start=&quot;18849&quot;&gt;Invoices&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18987&quot; data-start=&quot;18860&quot;&gt;
&lt;p data-end=&quot;18872&quot; data-start=&quot;18862&quot;&gt;Accounting&lt;/p&gt;
&lt;ul data-end=&quot;18987&quot; data-start=&quot;18877&quot;&gt;
&lt;li data-end=&quot;18896&quot; data-start=&quot;18877&quot;&gt;
&lt;p data-end=&quot;18896&quot; data-start=&quot;18879&quot;&gt;Chart of Accounts&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18911&quot; data-start=&quot;18901&quot;&gt;
&lt;p data-end=&quot;18911&quot; data-start=&quot;18903&quot;&gt;Journals&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18933&quot; data-start=&quot;18916&quot;&gt;
&lt;p data-end=&quot;18933&quot; data-start=&quot;18918&quot;&gt;Journal Entries&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;18987&quot; data-start=&quot;18938&quot;&gt;
&lt;p data-end=&quot;18987&quot; data-start=&quot;18940&quot;&gt;Reports (GL, Trial Balance, P&amp;amp;L, Balance Sheet)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19061&quot; data-start=&quot;18990&quot;&gt;
&lt;p data-end=&quot;19000&quot; data-start=&quot;18992&quot;&gt;Settings&lt;/p&gt;
&lt;ul data-end=&quot;19061&quot; data-start=&quot;19005&quot;&gt;
&lt;li data-end=&quot;19012&quot; data-start=&quot;19005&quot;&gt;
&lt;p data-end=&quot;19012&quot; data-start=&quot;19007&quot;&gt;Users&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19038&quot; data-start=&quot;19017&quot;&gt;
&lt;p data-end=&quot;19038&quot; data-start=&quot;19019&quot;&gt;Roles &amp;amp; Permissions&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19061&quot; data-start=&quot;19043&quot;&gt;
&lt;p data-end=&quot;19061&quot; data-start=&quot;19045&quot;&gt;Company Settings&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;19089&quot; data-start=&quot;19063&quot;&gt;6.2 Desain Form &amp;amp; Tabel&lt;/h2&gt;
&lt;ul data-end=&quot;19287&quot; data-start=&quot;19091&quot;&gt;
&lt;li data-end=&quot;19173&quot; data-start=&quot;19091&quot;&gt;
&lt;p data-end=&quot;19116&quot; data-start=&quot;19093&quot;&gt;Tabel data menggunakan:&lt;/p&gt;
&lt;ul data-end=&quot;19173&quot; data-start=&quot;19119&quot;&gt;
&lt;li data-end=&quot;19130&quot; data-start=&quot;19119&quot;&gt;
&lt;p data-end=&quot;19130&quot; data-start=&quot;19121&quot;&gt;Paginasi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19154&quot; data-start=&quot;19133&quot;&gt;
&lt;p data-end=&quot;19154&quot; data-start=&quot;19135&quot;&gt;Pencarian (filter).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19173&quot; data-start=&quot;19157&quot;&gt;
&lt;p data-end=&quot;19173&quot; data-start=&quot;19159&quot;&gt;Sorting kolom.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19287&quot; data-start=&quot;19174&quot;&gt;
&lt;p data-end=&quot;19187&quot; data-start=&quot;19176&quot;&gt;Form input:&lt;/p&gt;
&lt;ul data-end=&quot;19287&quot; data-start=&quot;19190&quot;&gt;
&lt;li data-end=&quot;19238&quot; data-start=&quot;19190&quot;&gt;
&lt;p data-end=&quot;19238&quot; data-start=&quot;19192&quot;&gt;Menggunakan grid bootstrap (col-*) untuk rapi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19287&quot; data-start=&quot;19241&quot;&gt;
&lt;p data-end=&quot;19287&quot; data-start=&quot;19243&quot;&gt;Tombol utama (Save, Cancel) selalu di bawah.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;19292&quot; data-start=&quot;19289&quot; /&gt;
&lt;h1 data-end=&quot;19324&quot; data-start=&quot;19294&quot;&gt;7. Aturan Bisnis (Ringkasan)&lt;/h1&gt;
&lt;ul data-end=&quot;19730&quot; data-start=&quot;19326&quot;&gt;
&lt;li data-end=&quot;19502&quot; data-start=&quot;19326&quot;&gt;
&lt;p data-end=&quot;19409&quot; data-start=&quot;19328&quot;&gt;Dokumen dengan status “Posted” atau “Confirmed” tidak boleh dihapus, hanya boleh:&lt;/p&gt;
&lt;ul data-end=&quot;19502&quot; data-start=&quot;19412&quot;&gt;
&lt;li data-end=&quot;19446&quot; data-start=&quot;19412&quot;&gt;
&lt;p data-end=&quot;19446&quot; data-start=&quot;19414&quot;&gt;Dibatalkan (void) dengan alasan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19502&quot; data-start=&quot;19449&quot;&gt;
&lt;p data-end=&quot;19502&quot; data-start=&quot;19451&quot;&gt;Dibuat jurnal pembalik (untuk akuntansi, opsional).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19550&quot; data-start=&quot;19503&quot;&gt;
&lt;p data-end=&quot;19550&quot; data-start=&quot;19505&quot;&gt;Tidak boleh ada jurnal dengan debit ≠ kredit.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19632&quot; data-start=&quot;19551&quot;&gt;
&lt;p data-end=&quot;19632&quot; data-start=&quot;19553&quot;&gt;Tidak boleh mengubah CoA yang sudah digunakan di jurnal (hanya boleh nonaktif).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19730&quot; data-start=&quot;19633&quot;&gt;
&lt;p data-end=&quot;19730&quot; data-start=&quot;19635&quot;&gt;Penomoran dokumen (SO, PO, Invoice, Journal) unik per tipe dan per tahun (misal: SO/2025/0001).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;19735&quot; data-start=&quot;19732&quot; /&gt;
&lt;h1 data-end=&quot;19798&quot; data-start=&quot;19737&quot;&gt;8. Kriteria Penerimaan (Acceptance Criteria) Tingkat Tinggi&lt;/h1&gt;
&lt;ul data-end=&quot;20406&quot; data-start=&quot;19800&quot;&gt;
&lt;li data-end=&quot;19910&quot; data-start=&quot;19800&quot;&gt;
&lt;p data-end=&quot;19819&quot; data-start=&quot;19802&quot;&gt;User Sales dapat:&lt;/p&gt;
&lt;ul data-end=&quot;19910&quot; data-start=&quot;19822&quot;&gt;
&lt;li data-end=&quot;19910&quot; data-start=&quot;19822&quot;&gt;
&lt;p data-end=&quot;19910&quot; data-start=&quot;19824&quot;&gt;Membuat Quotation, mengkonversi ke SO, membuat Invoice, dan melihat status pembayaran.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;19999&quot; data-start=&quot;19911&quot;&gt;
&lt;p data-end=&quot;19935&quot; data-start=&quot;19913&quot;&gt;User Purchasing dapat:&lt;/p&gt;
&lt;ul data-end=&quot;19999&quot; data-start=&quot;19938&quot;&gt;
&lt;li data-end=&quot;19999&quot; data-start=&quot;19938&quot;&gt;
&lt;p data-end=&quot;19999&quot; data-start=&quot;19940&quot;&gt;Membuat PO, mencatat penerimaan, membuat Invoice pembelian.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;20146&quot; data-start=&quot;20000&quot;&gt;
&lt;p data-end=&quot;20021&quot; data-start=&quot;20002&quot;&gt;User Finance dapat:&lt;/p&gt;
&lt;ul data-end=&quot;20146&quot; data-start=&quot;20024&quot;&gt;
&lt;li data-end=&quot;20146&quot; data-start=&quot;20024&quot;&gt;
&lt;p data-end=&quot;20146&quot; data-start=&quot;20026&quot;&gt;Melihat daftar invoice, melakukan pencatatan pembayaran, membuat jurnal manual, dan menghasilkan laporan keuangan dasar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;20242&quot; data-start=&quot;20147&quot;&gt;
&lt;p data-end=&quot;20165&quot; data-start=&quot;20149&quot;&gt;Manajemen dapat:&lt;/p&gt;
&lt;ul data-end=&quot;20242&quot; data-start=&quot;20168&quot;&gt;
&lt;li data-end=&quot;20242&quot; data-start=&quot;20168&quot;&gt;
&lt;p data-end=&quot;20242&quot; data-start=&quot;20170&quot;&gt;Login, melihat dashboard dan laporan tanpa bisa mengubah data transaksi.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;20406&quot; data-start=&quot;20243&quot;&gt;
&lt;p data-end=&quot;20252&quot; data-start=&quot;20245&quot;&gt;Sistem:&lt;/p&gt;
&lt;ul data-end=&quot;20406&quot; data-start=&quot;20255&quot;&gt;
&lt;li data-end=&quot;20290&quot; data-start=&quot;20255&quot;&gt;
&lt;p data-end=&quot;20290&quot; data-start=&quot;20257&quot;&gt;Mencatat semua audit log penting.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;20346&quot; data-start=&quot;20293&quot;&gt;
&lt;p data-end=&quot;20346&quot; data-start=&quot;20295&quot;&gt;Melindungi dari akses tanpa otorisasi (role-based).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;20406&quot; data-start=&quot;20349&quot;&gt;
&lt;p data-end=&quot;20406&quot; data-start=&quot;20351&quot;&gt;Dapat berjalan stabil dalam penggunaan harian internal.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/1366920806401727624/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/12/software-requirements-specification-srs.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1366920806401727624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1366920806401727624'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/12/software-requirements-specification-srs.html' title='Software Requirements Specification (SRS) Enterprise Resource Planning'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-1481565443184747948</id><published>2025-11-06T05:02:00.007+07:00</published><updated>2025-11-06T05:12:30.105+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 10 — Membuat Dashboard Visual dari Data Spreadsheet</title><content type='html'>&lt;h2 data-end=&quot;244&quot; data-start=&quot;193&quot;&gt;📊 Menampilkan Data dalam Grafik &amp;amp; UI Interaktif&lt;/h2&gt;
&lt;p data-end=&quot;502&quot; data-start=&quot;246&quot;&gt;Di seri sebelumnya, kita sudah membuat &lt;a href=&quot;/2025/11/seri-10-membuat-dashboard-visual-dari.html&quot; target=&quot;_blank&quot;&gt;&lt;strong data-end=&quot;296&quot; data-start=&quot;285&quot;&gt;Web App&lt;/strong&gt; sederhana menggunakan Google Apps Script (GAS).&lt;/a&gt;&lt;br data-end=&quot;347&quot; data-start=&quot;344&quot; /&gt;
Sekarang, kita akan melangkah lebih jauh: &lt;strong data-end=&quot;430&quot; data-start=&quot;389&quot;&gt;membuat dashboard visual berbasis web&lt;/strong&gt; yang menampilkan data dari Google Sheets dalam bentuk tabel dan grafik.&lt;/p&gt;
&lt;p data-end=&quot;641&quot; data-start=&quot;504&quot;&gt;Dashboard seperti ini bisa kita gunakan untuk:&lt;br /&gt;
✅ Laporan penjualan&lt;br data-end=&quot;573&quot; data-start=&quot;570&quot; /&gt;
✅ Statistik kehadiran&lt;br data-end=&quot;597&quot; data-start=&quot;594&quot; /&gt;
✅ Monitoring stok barang&lt;br data-end=&quot;624&quot; data-start=&quot;621&quot; /&gt;
✅ Rekap kinerja&lt;/p&gt;
&lt;p data-end=&quot;710&quot; data-start=&quot;643&quot;&gt;GAS + Sheets + HTML + Chart = solusi lengkap tanpa server tambahan!&lt;/p&gt;
&lt;hr data-end=&quot;715&quot; data-start=&quot;712&quot; /&gt;
&lt;h2 data-end=&quot;738&quot; data-start=&quot;717&quot;&gt;🎯 Tujuan Seri Ini&lt;/h2&gt;
&lt;p data-end=&quot;768&quot; data-start=&quot;740&quot;&gt;Di seri kali ini, kita akan:&lt;/p&gt;
&lt;ol data-end=&quot;942&quot; data-start=&quot;769&quot;&gt;
&lt;li data-end=&quot;803&quot; data-start=&quot;769&quot;&gt;
&lt;p data-end=&quot;803&quot; data-start=&quot;772&quot;&gt;Membaca data dari Google Sheets&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;836&quot; data-start=&quot;804&quot;&gt;
&lt;p data-end=&quot;836&quot; data-start=&quot;807&quot;&gt;Mengirim data ke halaman HTML&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;868&quot; data-start=&quot;837&quot;&gt;
&lt;p data-end=&quot;868&quot; data-start=&quot;840&quot;&gt;Menampilkan data dalam tabel&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;912&quot; data-start=&quot;869&quot;&gt;
&lt;p data-end=&quot;912&quot; data-start=&quot;872&quot;&gt;Membuat grafik menggunakan Google Charts&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;942&quot; data-start=&quot;913&quot;&gt;
&lt;p data-end=&quot;942&quot; data-start=&quot;916&quot;&gt;Men-deploy sebagai Web App&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;947&quot; data-start=&quot;944&quot; /&gt;
&lt;h2 data-end=&quot;968&quot; data-start=&quot;949&quot;&gt;✅ 1. Source Data&lt;/h2&gt;
&lt;p data-end=&quot;1023&quot; data-start=&quot;970&quot;&gt;Misal kita punya data penjualan di Sheet “Penjualan”:&lt;/p&gt;
&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;div class=&quot;group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse&quot; tabindex=&quot;-1&quot;&gt;&lt;table class=&quot;w-fit min-w-(--thread-content-width)&quot; data-end=&quot;1199&quot; data-start=&quot;1025&quot;&gt;&lt;thead data-end=&quot;1059&quot; data-start=&quot;1025&quot;&gt;&lt;tr data-end=&quot;1059&quot; data-start=&quot;1025&quot;&gt;&lt;th data-col-size=&quot;sm&quot; data-end=&quot;1040&quot; data-start=&quot;1025&quot;&gt;Tanggal&lt;/th&gt;&lt;th data-col-size=&quot;sm&quot; data-end=&quot;1049&quot; data-start=&quot;1040&quot;&gt;Produk&lt;/th&gt;&lt;th data-col-size=&quot;sm&quot; data-end=&quot;1059&quot; data-start=&quot;1049&quot;&gt;Jumlah&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-end=&quot;1199&quot; data-start=&quot;1095&quot;&gt;&lt;tr data-end=&quot;1129&quot; data-start=&quot;1095&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1110&quot; data-start=&quot;1095&quot;&gt;2025-01-01&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1119&quot; data-start=&quot;1110&quot;&gt;A&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1129&quot; data-start=&quot;1119&quot;&gt;10&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;1164&quot; data-start=&quot;1130&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1145&quot; data-start=&quot;1130&quot;&gt;2025-01-02&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1154&quot; data-start=&quot;1145&quot;&gt;B&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1164&quot; data-start=&quot;1154&quot;&gt;12&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;1199&quot; data-start=&quot;1165&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1180&quot; data-start=&quot;1165&quot;&gt;2025-01-02&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1189&quot; data-start=&quot;1180&quot;&gt;A&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1199&quot; data-start=&quot;1189&quot;&gt;7&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p data-end=&quot;1254&quot; data-start=&quot;1201&quot;&gt;Kita akan membuat grafik jumlah penjualan by tanggal.&lt;/p&gt;&lt;p data-end=&quot;1254&quot; data-start=&quot;1201&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhFAkouXmxpkKgiGaiSPlPYvyPGxK8jalj712pYIvN6LVC8XrMjMqhfXrJ3Kmyg-5tZAcIu8faA8I10522jZF9c5y9pDKputUQ4VlTf9NApg8oTIlai39i1oCrNwSnZ6eKPMqMz1C06I1fahfvcbSsdI4gNcBpaQ2nfdky615cQj8DfYxmLlwwCD5ita8A7&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;source data grafik&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhFAkouXmxpkKgiGaiSPlPYvyPGxK8jalj712pYIvN6LVC8XrMjMqhfXrJ3Kmyg-5tZAcIu8faA8I10522jZF9c5y9pDKputUQ4VlTf9NApg8oTIlai39i1oCrNwSnZ6eKPMqMz1C06I1fahfvcbSsdI4gNcBpaQ2nfdky615cQj8DfYxmLlwwCD5ita8A7=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1259&quot; data-start=&quot;1256&quot; /&gt;
&lt;h2 data-end=&quot;1300&quot; data-start=&quot;1261&quot;&gt;✅ 2. Code.gs — Ambil Data dari Sheet&lt;/h2&gt;
&lt;p data-end=&quot;1322&quot; data-start=&quot;1302&quot;&gt;Buat file &lt;code data-end=&quot;1321&quot; data-start=&quot;1312&quot;&gt;Code.gs&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1949&quot; data-start=&quot;1324&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #bbbbbb; font-family: &amp;quot;Roboto Mono&amp;quot;, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; line-height: 18px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;doGet&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;template&lt;/span&gt; = &lt;span style=&quot;color: #ffc66d;&quot;&gt;HtmlService&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;createTemplateFromFile&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;index&#39;&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #b589cc;&quot;&gt;template&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt; = &lt;span style=&quot;color: #b589cc;&quot;&gt;getData&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;template&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;evaluate&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;getData&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;sheet&lt;/span&gt; = &lt;span style=&quot;color: #ffc66d;&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;getActive&lt;/span&gt;().&lt;span style=&quot;color: #b589cc;&quot;&gt;getSheetByName&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;Penjualan&#39;&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;values&lt;/span&gt; = &lt;span style=&quot;color: #b589cc;&quot;&gt;sheet&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;getDataRange&lt;/span&gt;().&lt;span style=&quot;color: #b589cc;&quot;&gt;getValues&lt;/span&gt;();&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #888888;&quot;&gt;// Buang header&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt; = &lt;span style=&quot;color: #b589cc;&quot;&gt;values&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;slice&lt;/span&gt;(&lt;span style=&quot;color: #6897bb;&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #888888;&quot;&gt;// Format ulang data ke array: [Tanggal, Jumlah]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;formatted&lt;/span&gt; = &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;map&lt;/span&gt;(&lt;span style=&quot;color: #b589cc;&quot;&gt;row&lt;/span&gt; =&amp;gt; [&lt;span style=&quot;color: #b589cc;&quot;&gt;row&lt;/span&gt;[&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;], &lt;span style=&quot;color: #b589cc;&quot;&gt;row&lt;/span&gt;[&lt;span style=&quot;color: #6897bb;&quot;&gt;2&lt;/span&gt;]]);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;formatted&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// Util untuk include HTML terpisah&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;include&lt;/span&gt;(&lt;span style=&quot;color: #b589cc;&quot;&gt;filename&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;HtmlService&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;createHtmlOutputFromFile&lt;/span&gt;(&lt;span style=&quot;color: #b589cc;&quot;&gt;filename&lt;/span&gt;).&lt;span style=&quot;color: #b589cc;&quot;&gt;getContent&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1962&quot; data-start=&quot;1951&quot;&gt;Penjelasan:&lt;/p&gt;
&lt;ul data-end=&quot;2094&quot; data-start=&quot;1963&quot;&gt;
&lt;li data-end=&quot;2035&quot; data-start=&quot;1963&quot;&gt;
&lt;p data-end=&quot;2035&quot; data-start=&quot;1965&quot;&gt;&lt;code data-end=&quot;1976&quot; data-start=&quot;1965&quot;&gt;getData()&lt;/code&gt; mengambil data dan hanya menyisakan kolom tanggal + jumlah&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2094&quot; data-start=&quot;2036&quot;&gt;
&lt;p data-end=&quot;2094&quot; data-start=&quot;2038&quot;&gt;Data akan dikirim ke HTML via templating &lt;code data-end=&quot;2094&quot; data-start=&quot;2079&quot;&gt;template.data&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2099&quot; data-start=&quot;2096&quot; /&gt;
&lt;h2 data-end=&quot;2134&quot; data-start=&quot;2101&quot;&gt;✅ 3. index.html — Dashboard UI&lt;/h2&gt;
&lt;p data-end=&quot;2164&quot; data-start=&quot;2136&quot;&gt;Buat file baru &lt;code data-end=&quot;2163&quot; data-start=&quot;2151&quot;&gt;index.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2572&quot; data-start=&quot;2166&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #bbbbbb; font-family: &amp;quot;Roboto Mono&amp;quot;, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; line-height: 18px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #888888;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;base&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;_top&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #888888;&quot;&gt;&amp;lt;!-- Load Google Charts --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;https://www.gstatic.com/charts/loader.js&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;body&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;container&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;Dashboard Penjualan&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;chart&quot;&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;width: 100%; height: 400px;&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;table&quot;&lt;/span&gt; &lt;span style=&quot;color: #a772d0;&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;margin-top: 30px;&quot;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;&lt;/span&gt;?!= include(&#39;script&#39;); ?&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2577&quot; data-start=&quot;2574&quot; /&gt;
&lt;h2 data-end=&quot;2614&quot; data-start=&quot;2579&quot;&gt;✅ 4. script.html — Script Grafik&lt;/h2&gt;
&lt;p data-end=&quot;2650&quot; data-start=&quot;2616&quot;&gt;Buat file HTML baru &lt;code data-end=&quot;2649&quot; data-start=&quot;2636&quot;&gt;script.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3877&quot; data-start=&quot;2652&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;language-javascript&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; dataFromServer = &amp;lt;?= &lt;span class=&quot;hljs-title class_&quot;&gt;JSON&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;stringify&lt;/span&gt;(data) ?&amp;gt;;

  google.&lt;span class=&quot;hljs-property&quot;&gt;charts&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;load&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;current&quot;&lt;/span&gt;, { &lt;span class=&quot;hljs-attr&quot;&gt;packages&lt;/span&gt;: [&lt;span class=&quot;hljs-string&quot;&gt;&quot;corechart&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;table&quot;&lt;/span&gt;] });
  google.&lt;span class=&quot;hljs-property&quot;&gt;charts&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;setOnLoadCallback&lt;/span&gt;(drawAll);

  &lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;drawAll&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
    &lt;span class=&quot;hljs-title function_&quot;&gt;drawChart&lt;/span&gt;();
    &lt;span class=&quot;hljs-title function_&quot;&gt;drawTable&lt;/span&gt;();
  }

  &lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;drawChart&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; tableData = &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; google.&lt;span class=&quot;hljs-property&quot;&gt;visualization&lt;/span&gt;.&lt;span class=&quot;hljs-title class_&quot;&gt;DataTable&lt;/span&gt;();
    tableData.&lt;span class=&quot;hljs-title function_&quot;&gt;addColumn&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;date&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Tanggal&quot;&lt;/span&gt;);
    tableData.&lt;span class=&quot;hljs-title function_&quot;&gt;addColumn&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;number&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Jumlah&quot;&lt;/span&gt;);

    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; rows = dataFromServer.&lt;span class=&quot;hljs-title function_&quot;&gt;map&lt;/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-params&quot;&gt;row&lt;/span&gt;&lt;/span&gt; =&amp;gt; {
      &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; [&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;(row[&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;]), &lt;span class=&quot;hljs-title class_&quot;&gt;Number&lt;/span&gt;(row[&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;])];
    });

    tableData.&lt;span class=&quot;hljs-title function_&quot;&gt;addRows&lt;/span&gt;(rows);

    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; options = {
      &lt;span class=&quot;hljs-attr&quot;&gt;title&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&quot;Penjualan per Hari&quot;&lt;/span&gt;,
      &lt;span class=&quot;hljs-attr&quot;&gt;legend&lt;/span&gt;: { &lt;span class=&quot;hljs-attr&quot;&gt;position&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&quot;bottom&quot;&lt;/span&gt; }
    };

    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; chart = &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; google.&lt;span class=&quot;hljs-property&quot;&gt;visualization&lt;/span&gt;.&lt;span class=&quot;hljs-title class_&quot;&gt;LineChart&lt;/span&gt;(&lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;chart&quot;&lt;/span&gt;));
    chart.&lt;span class=&quot;hljs-title function_&quot;&gt;draw&lt;/span&gt;(tableData, options);
  }

  &lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;drawTable&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; tableData = &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; google.&lt;span class=&quot;hljs-property&quot;&gt;visualization&lt;/span&gt;.&lt;span class=&quot;hljs-title class_&quot;&gt;DataTable&lt;/span&gt;();
    tableData.&lt;span class=&quot;hljs-title function_&quot;&gt;addColumn&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;date&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Tanggal&quot;&lt;/span&gt;);
    tableData.&lt;span class=&quot;hljs-title function_&quot;&gt;addColumn&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;number&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Jumlah&quot;&lt;/span&gt;);

    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; rows = dataFromServer.&lt;span class=&quot;hljs-title function_&quot;&gt;map&lt;/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-params&quot;&gt;row&lt;/span&gt;&lt;/span&gt; =&amp;gt; {
      &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; [&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;(row[&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;]), &lt;span class=&quot;hljs-title class_&quot;&gt;Number&lt;/span&gt;(row[&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;])];
    });

    tableData.&lt;span class=&quot;hljs-title function_&quot;&gt;addRows&lt;/span&gt;(rows);

    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; table = &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; google.&lt;span class=&quot;hljs-property&quot;&gt;visualization&lt;/span&gt;.&lt;span class=&quot;hljs-title class_&quot;&gt;Table&lt;/span&gt;(&lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;table&quot;&lt;/span&gt;));
    table.&lt;span class=&quot;hljs-title function_&quot;&gt;draw&lt;/span&gt;(tableData);
  }
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3890&quot; data-start=&quot;3879&quot;&gt;Penjelasan:&lt;/p&gt;
&lt;ul data-end=&quot;4050&quot; data-start=&quot;3891&quot;&gt;
&lt;li data-end=&quot;3949&quot; data-start=&quot;3891&quot;&gt;
&lt;p data-end=&quot;3949&quot; data-start=&quot;3893&quot;&gt;&lt;code data-end=&quot;3909&quot; data-start=&quot;3893&quot;&gt;dataFromServer&lt;/code&gt; berisi array data yang berasal dari GAS&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3995&quot; data-start=&quot;3950&quot;&gt;
&lt;p data-end=&quot;3995&quot; data-start=&quot;3952&quot;&gt;Kita buat 2 visualisasi: line chart + table&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4050&quot; data-start=&quot;3996&quot;&gt;
&lt;p data-end=&quot;4050&quot; data-start=&quot;3998&quot;&gt;Google Charts memudahkan pembuatan grafik interaktif&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4055&quot; data-start=&quot;4052&quot; /&gt;
&lt;h2 data-end=&quot;4079&quot; data-start=&quot;4057&quot;&gt;✅ 5. Deploy Web App&lt;/h2&gt;
&lt;ol data-end=&quot;4145&quot; data-start=&quot;4081&quot;&gt;
&lt;li data-end=&quot;4116&quot; data-start=&quot;4081&quot;&gt;
&lt;p data-end=&quot;4116&quot; data-start=&quot;4084&quot;&gt;Klik &lt;strong data-end=&quot;4116&quot; data-start=&quot;4089&quot;&gt;Deploy → New Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4137&quot; data-start=&quot;4117&quot;&gt;
&lt;p data-end=&quot;4137&quot; data-start=&quot;4120&quot;&gt;Pilih &lt;strong data-end=&quot;4137&quot; data-start=&quot;4126&quot;&gt;Web App&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4145&quot; data-start=&quot;4138&quot;&gt;
&lt;p data-end=&quot;4145&quot; data-start=&quot;4141&quot;&gt;Set:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul data-end=&quot;4195&quot; data-start=&quot;4146&quot;&gt;
&lt;li data-end=&quot;4166&quot; data-start=&quot;4146&quot;&gt;
&lt;p data-end=&quot;4166&quot; data-start=&quot;4148&quot;&gt;Execute as: &lt;strong data-end=&quot;4166&quot; data-start=&quot;4160&quot;&gt;Me&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4195&quot; data-start=&quot;4167&quot;&gt;
&lt;p data-end=&quot;4195&quot; data-start=&quot;4169&quot;&gt;Who has access: &lt;strong data-end=&quot;4195&quot; data-start=&quot;4185&quot;&gt;Anyone&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol data-end=&quot;4214&quot; data-start=&quot;4196&quot; start=&quot;4&quot;&gt;
&lt;li data-end=&quot;4214&quot; data-start=&quot;4196&quot;&gt;
&lt;p data-end=&quot;4214&quot; data-start=&quot;4199&quot;&gt;Klik &lt;strong data-end=&quot;4214&quot; data-start=&quot;4204&quot;&gt;Deploy&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;4271&quot; data-start=&quot;4216&quot;&gt;Copy URL → buka di browser → Dashboard siap digunakan ✅&lt;/p&gt;
&lt;hr data-end=&quot;4276&quot; data-start=&quot;4273&quot; /&gt;
&lt;h2 data-end=&quot;4307&quot; data-start=&quot;4278&quot;&gt;✅ 6. Penjelasan Alur Utama&lt;/h2&gt;
&lt;ol data-end=&quot;4528&quot; data-start=&quot;4309&quot;&gt;
&lt;li data-end=&quot;4369&quot; data-start=&quot;4309&quot;&gt;
&lt;p data-end=&quot;4369&quot; data-start=&quot;4312&quot;&gt;&lt;code data-end=&quot;4323&quot; data-start=&quot;4312&quot;&gt;getData()&lt;/code&gt; ambil data dari Sheets → berikan ke &lt;code data-end=&quot;4369&quot; data-start=&quot;4360&quot;&gt;doGet()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4409&quot; data-start=&quot;4370&quot;&gt;
&lt;p data-end=&quot;4409&quot; data-start=&quot;4373&quot;&gt;&lt;code data-end=&quot;4382&quot; data-start=&quot;4373&quot;&gt;doGet()&lt;/code&gt; kirim data ke &lt;code data-end=&quot;4409&quot; data-start=&quot;4397&quot;&gt;index.html&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4455&quot; data-start=&quot;4410&quot;&gt;
&lt;p data-end=&quot;4455&quot; data-start=&quot;4413&quot;&gt;&lt;code data-end=&quot;4426&quot; data-start=&quot;4413&quot;&gt;script.html&lt;/code&gt; menerima data via templating&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4501&quot; data-start=&quot;4456&quot;&gt;
&lt;p data-end=&quot;4501&quot; data-start=&quot;4459&quot;&gt;Google Charts mengubah data menjadi grafik&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4528&quot; data-start=&quot;4502&quot;&gt;
&lt;p data-end=&quot;4528&quot; data-start=&quot;4505&quot;&gt;Hasil tampil di Web App&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;4558&quot; data-start=&quot;4530&quot;&gt;Alurnya visual dan otomatis!&lt;/p&gt;
&lt;hr data-end=&quot;4563&quot; data-start=&quot;4560&quot; /&gt;
&lt;h2 data-end=&quot;4594&quot; data-start=&quot;4565&quot;&gt;✅ 7. Kustomisasi Dashboard&lt;/h2&gt;
&lt;p data-end=&quot;4618&quot; data-start=&quot;4596&quot;&gt;Kita bisa menambahkan:&lt;/p&gt;
&lt;ul data-end=&quot;4722&quot; data-start=&quot;4619&quot;&gt;
&lt;li data-end=&quot;4638&quot; data-start=&quot;4619&quot;&gt;
&lt;p data-end=&quot;4638&quot; data-start=&quot;4621&quot;&gt;Filter per produk&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4662&quot; data-start=&quot;4639&quot;&gt;
&lt;p data-end=&quot;4662&quot; data-start=&quot;4641&quot;&gt;Pilihan range tanggal&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4688&quot; data-start=&quot;4663&quot;&gt;
&lt;p data-end=&quot;4688&quot; data-start=&quot;4665&quot;&gt;Grafik bar / pie / area&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4722&quot; data-start=&quot;4689&quot;&gt;
&lt;p data-end=&quot;4722&quot; data-start=&quot;4691&quot;&gt;Data summary (total, rata-rata)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4748&quot; data-start=&quot;4724&quot;&gt;Contoh tambahan summary:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4939&quot; data-start=&quot;4750&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;getSummary&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = &lt;span class=&quot;hljs-title function_&quot;&gt;getData&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; total = data.&lt;span class=&quot;hljs-title function_&quot;&gt;reduce&lt;/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;(&lt;span class=&quot;hljs-params&quot;&gt;acc, row&lt;/span&gt;&lt;/span&gt;) =&amp;gt; acc + row[&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;], &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;);
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; avg = total / data.&lt;span class=&quot;hljs-property&quot;&gt;length&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; { total, avg };
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;4944&quot; data-start=&quot;4941&quot; /&gt;
&lt;h2 data-end=&quot;4966&quot; data-start=&quot;4946&quot;&gt;✅ 8. Tips Styling&lt;/h2&gt;
&lt;p data-end=&quot;5001&quot; data-start=&quot;4968&quot;&gt;Jika ingin tampilan lebih cantik:&lt;/p&gt;
&lt;ul data-end=&quot;5096&quot; data-start=&quot;5002&quot;&gt;
&lt;li data-end=&quot;5017&quot; data-start=&quot;5002&quot;&gt;
&lt;p data-end=&quot;5017&quot; data-start=&quot;5004&quot;&gt;Tambahkan CSS&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5066&quot; data-start=&quot;5018&quot;&gt;
&lt;p data-end=&quot;5066&quot; data-start=&quot;5020&quot;&gt;Gunakan framework seperti Bootstrap / Tailwind&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5096&quot; data-start=&quot;5067&quot;&gt;
&lt;p data-end=&quot;5096&quot; data-start=&quot;5069&quot;&gt;Pisahkan logic JS agar rapi&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5117&quot; data-start=&quot;5098&quot;&gt;Contoh include CSS:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;5233&quot; data-start=&quot;5119&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;link&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css&quot;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;5238&quot; data-start=&quot;5235&quot; /&gt;
&lt;h2 data-end=&quot;5277&quot; data-start=&quot;5240&quot;&gt;✅ 9. Apa yang Sudah Kita Pelajari?&lt;/h2&gt;
&lt;p data-end=&quot;5471&quot; data-start=&quot;5279&quot;&gt;✔ Membaca data dari Google Sheets&lt;br data-end=&quot;5315&quot; data-start=&quot;5312&quot; /&gt;
✔ Mengirim data ke halaman web&lt;br data-end=&quot;5348&quot; data-start=&quot;5345&quot; /&gt;
✔ Menampilkan data dalam tabel&lt;br data-end=&quot;5381&quot; data-start=&quot;5378&quot; /&gt;
✔ Menampilkan grafik interaktif&lt;br data-end=&quot;5415&quot; data-start=&quot;5412&quot; /&gt;
✔ Menggunakan Google Charts&lt;br data-end=&quot;5445&quot; data-start=&quot;5442&quot; /&gt;
✔ Deploy sebagai Web App&lt;/p&gt;
&lt;p data-end=&quot;5562&quot; data-start=&quot;5473&quot;&gt;Kita sekarang bisa membangun dashboard monitoring tanpa server dan tanpa biaya tambahan ✅&lt;/p&gt;
&lt;hr data-end=&quot;5567&quot; data-start=&quot;5564&quot; /&gt;
&lt;h2 data-end=&quot;5590&quot; data-start=&quot;5569&quot;&gt;🧩 Use Case Lanjut&lt;/h2&gt;
&lt;p data-end=&quot;5769&quot; data-start=&quot;5592&quot;&gt;Beberapa ide pengembangan:&lt;br /&gt;
✅ Dashboard penjualan per produk&lt;br data-end=&quot;5654&quot; data-start=&quot;5651&quot; /&gt;
✅ Monitoring absensi siswa&lt;br data-end=&quot;5683&quot; data-start=&quot;5680&quot; /&gt;
✅ Stok barang &amp;amp; alert jika minimum&lt;br data-end=&quot;5720&quot; data-start=&quot;5717&quot; /&gt;
✅ Dashboard survey&lt;br data-end=&quot;5741&quot; data-start=&quot;5738&quot; /&gt;
✅ Laporan bulanan otomatis&lt;/p&gt;
&lt;p data-end=&quot;5851&quot; data-start=&quot;5771&quot;&gt;Kita bisa membuat sistem reporting internal yang cukup lengkap dengan biaya nol!&lt;/p&gt;
&lt;hr data-end=&quot;5856&quot; data-start=&quot;5853&quot; /&gt;
&lt;h2 data-end=&quot;5880&quot; data-start=&quot;5858&quot;&gt;🔜 Seri Selanjutnya&lt;/h2&gt;
&lt;blockquote data-end=&quot;5964&quot; data-start=&quot;5881&quot;&gt;
&lt;p data-end=&quot;5964&quot; data-start=&quot;5883&quot;&gt;&lt;strong data-end=&quot;5964&quot; data-start=&quot;5883&quot;&gt;Seri 11 — Database Mini: CRUD (Create, Read, Update, Delete) di Google Sheets&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;6074&quot; data-start=&quot;5966&quot;&gt;Kita akan membangun form + tabel yang mendukung:&lt;br /&gt;
✅ tambah data&lt;br data-end=&quot;6031&quot; data-start=&quot;6028&quot; /&gt;
✅ lihat data&lt;br data-end=&quot;6046&quot; data-start=&quot;6043&quot; /&gt;
✅ edit data&lt;br data-end=&quot;6060&quot; data-start=&quot;6057&quot; /&gt;
✅ hapus data&lt;/p&gt;
&lt;p data-end=&quot;6108&quot; data-start=&quot;6076&quot;&gt;Kayak aplikasi database beneran!&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/1481565443184747948/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/11/seri-10-membuat-dashboard-visual-dari.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1481565443184747948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1481565443184747948'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/11/seri-10-membuat-dashboard-visual-dari.html' title='Seri 10 — Membuat Dashboard Visual dari Data Spreadsheet'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhFAkouXmxpkKgiGaiSPlPYvyPGxK8jalj712pYIvN6LVC8XrMjMqhfXrJ3Kmyg-5tZAcIu8faA8I10522jZF9c5y9pDKputUQ4VlTf9NApg8oTIlai39i1oCrNwSnZ6eKPMqMz1C06I1fahfvcbSsdI4gNcBpaQ2nfdky615cQj8DfYxmLlwwCD5ita8A7=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-700512428056526931</id><published>2025-11-05T05:21:00.003+07:00</published><updated>2025-11-05T05:21:57.797+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 9 — Membuat Web App dengan Google Apps Script</title><content type='html'>&lt;p data-end=&quot;532&quot; data-start=&quot;269&quot;&gt;Pada seri sebelumnya, kita telah belajar &lt;a href=&quot;/2025/11/seri-8-menghubungkan-google-apps-script.html&quot;&gt;Menghubungkan Google Apps Script dengan API Eksternal&lt;/a&gt;. Pada seri ini, kita akan belajar membuat &lt;strong data-end=&quot;321&quot; data-start=&quot;310&quot;&gt;Web App&lt;/strong&gt; menggunakan Google Apps Script (GAS).&lt;br data-end=&quot;362&quot; data-start=&quot;359&quot; /&gt;
Dengan Web App, kita bisa membuat aplikasi berbasis web yang berjalan di server Google — tanpa harus menyewa hosting, tanpa backend kompleks, dan dapat diakses lewat URL!&lt;/p&gt;
&lt;p data-end=&quot;553&quot; data-start=&quot;534&quot;&gt;Kita akan membahas:&lt;/p&gt;
&lt;ol data-end=&quot;799&quot; data-start=&quot;554&quot;&gt;
&lt;li data-end=&quot;581&quot; data-start=&quot;554&quot;&gt;
&lt;p data-end=&quot;581&quot; data-start=&quot;557&quot;&gt;Apa itu Web App di GAS&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;612&quot; data-start=&quot;582&quot;&gt;
&lt;p data-end=&quot;612&quot; data-start=&quot;585&quot;&gt;Bagaimana Web App bekerja&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;613&quot;&gt;
&lt;p data-end=&quot;658&quot; data-start=&quot;616&quot;&gt;Struktur fungsi &lt;code data-end=&quot;641&quot; data-start=&quot;632&quot;&gt;doGet()&lt;/code&gt; dan &lt;code data-end=&quot;656&quot; data-start=&quot;646&quot;&gt;doPost()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;689&quot; data-start=&quot;659&quot;&gt;
&lt;p data-end=&quot;689&quot; data-start=&quot;662&quot;&gt;Membuat Web App sederhana&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;690&quot;&gt;
&lt;p data-end=&quot;713&quot; data-start=&quot;693&quot;&gt;Men-deploy Web App&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;714&quot;&gt;
&lt;p data-end=&quot;749&quot; data-start=&quot;717&quot;&gt;Mengirim data dari HTML ke GAS&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;799&quot; data-start=&quot;750&quot;&gt;
&lt;p data-end=&quot;799&quot; data-start=&quot;753&quot;&gt;Contoh Web App mini (form input → Spreadsheet)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;804&quot; data-start=&quot;801&quot; /&gt;
&lt;h2 data-end=&quot;837&quot; data-start=&quot;806&quot;&gt;✅ 1. Apa Itu Web App di GAS?&lt;/h2&gt;
&lt;p data-end=&quot;1007&quot; data-start=&quot;839&quot;&gt;Web App di Google Apps Script adalah aplikasi web yang berjalan di server Google, dapat diakses melalui URL publik/privat, serta dapat menerima HTTP request (GET/POST).&lt;/p&gt;
&lt;p data-end=&quot;1152&quot; data-start=&quot;1009&quot;&gt;Dengan Web App, kita dapat:&lt;br /&gt;
✅ Membuat form custom&lt;br data-end=&quot;1061&quot; data-start=&quot;1058&quot; /&gt;
✅ Membaca/menulis data ke Google Sheets&lt;br data-end=&quot;1103&quot; data-start=&quot;1100&quot; /&gt;
✅ Membuat dashboard sederhana&lt;br data-end=&quot;1135&quot; data-start=&quot;1132&quot; /&gt;
✅ Integrasi API&lt;/p&gt;
&lt;hr data-end=&quot;1157&quot; data-start=&quot;1154&quot; /&gt;
&lt;h2 data-end=&quot;1185&quot; data-start=&quot;1159&quot;&gt;✅ 2. Cara Kerja Web App&lt;/h2&gt;
&lt;p data-end=&quot;1232&quot; data-start=&quot;1187&quot;&gt;Web App bekerja menggunakan dua fungsi utama:&lt;/p&gt;
&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;div class=&quot;group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse&quot; tabindex=&quot;-1&quot;&gt;&lt;table class=&quot;w-fit min-w-(--thread-content-width)&quot; data-end=&quot;1401&quot; data-start=&quot;1234&quot;&gt;&lt;thead data-end=&quot;1253&quot; data-start=&quot;1234&quot;&gt;&lt;tr data-end=&quot;1253&quot; data-start=&quot;1234&quot;&gt;&lt;th data-col-size=&quot;sm&quot; data-end=&quot;1243&quot; data-start=&quot;1234&quot;&gt;Fungsi&lt;/th&gt;&lt;th data-col-size=&quot;md&quot; data-end=&quot;1253&quot; data-start=&quot;1243&quot;&gt;Tujuan&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-end=&quot;1401&quot; data-start=&quot;1274&quot;&gt;&lt;tr data-end=&quot;1337&quot; data-start=&quot;1274&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1287&quot; data-start=&quot;1274&quot;&gt;&lt;code data-end=&quot;1286&quot; data-start=&quot;1276&quot;&gt;doGet(e)&lt;/code&gt;&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;1337&quot; data-start=&quot;1287&quot;&gt;Menangani permintaan GET (misal halaman utama)&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;1401&quot; data-start=&quot;1338&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1352&quot; data-start=&quot;1338&quot;&gt;&lt;code data-end=&quot;1351&quot; data-start=&quot;1340&quot;&gt;doPost(e)&lt;/code&gt;&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;1401&quot; data-start=&quot;1352&quot;&gt;Menangani permintaan POST (misal submit form)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p data-end=&quot;1459&quot; data-start=&quot;1403&quot;&gt;Masing-masing fungsi akan mengembalikan response berupa:&lt;/p&gt;
&lt;ul data-end=&quot;1480&quot; data-start=&quot;1460&quot;&gt;
&lt;li data-end=&quot;1466&quot; data-start=&quot;1460&quot;&gt;
&lt;p data-end=&quot;1466&quot; data-start=&quot;1462&quot;&gt;HTML&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1473&quot; data-start=&quot;1467&quot;&gt;
&lt;p data-end=&quot;1473&quot; data-start=&quot;1469&quot;&gt;JSON&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1480&quot; data-start=&quot;1474&quot;&gt;
&lt;p data-end=&quot;1480&quot; data-start=&quot;1476&quot;&gt;Text&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1485&quot; data-start=&quot;1482&quot; /&gt;
&lt;h2 data-end=&quot;1517&quot; data-start=&quot;1487&quot;&gt;✅ 3. Struktur Dasar Web App&lt;/h2&gt;
&lt;h3 data-end=&quot;1539&quot; data-start=&quot;1519&quot;&gt;Fungsi &lt;code data-end=&quot;1539&quot; data-start=&quot;1530&quot;&gt;doGet()&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1640&quot; data-start=&quot;1541&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;doGet&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;ContentService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createTextOutput&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Hello Web App!&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1681&quot; data-start=&quot;1642&quot;&gt;Akses URL → browser akan menampilkan:&lt;/p&gt;
&lt;blockquote data-end=&quot;1698&quot; data-start=&quot;1682&quot;&gt;
&lt;p data-end=&quot;1698&quot; data-start=&quot;1684&quot;&gt;Hello Web App!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1721&quot; data-start=&quot;1700&quot;&gt;Fungsi &lt;code data-end=&quot;1721&quot; data-start=&quot;1711&quot;&gt;doPost()&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1822&quot; data-start=&quot;1723&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;doPost&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;ContentService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createTextOutput&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;POST response&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1877&quot; data-start=&quot;1824&quot;&gt;&lt;code data-end=&quot;1834&quot; data-start=&quot;1824&quot;&gt;doPost()&lt;/code&gt; biasanya dipakai untuk menerima data form.&lt;/p&gt;
&lt;hr data-end=&quot;1882&quot; data-start=&quot;1879&quot; /&gt;
&lt;h2 data-end=&quot;1931&quot; data-start=&quot;1884&quot;&gt;✅ 4. Membuat Web App Sederhana (HTML Output)&lt;/h2&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2129&quot; data-start=&quot;1933&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;doGet&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; html = &lt;span class=&quot;hljs-title class_&quot;&gt;HtmlService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createHtmlOutput&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`
    &amp;lt;h1&amp;gt;Selamat Datang di Web App Kita!&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;Dibuat dengan Google Apps Script ✨&amp;lt;/p&amp;gt;
  `&lt;/span&gt;);
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; html;
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2134&quot; data-start=&quot;2131&quot; /&gt;
&lt;h2 data-end=&quot;2158&quot; data-start=&quot;2136&quot;&gt;✅ 5. Deploy Web App&lt;/h2&gt;
&lt;ol data-end=&quot;2242&quot; data-start=&quot;2160&quot;&gt;
&lt;li data-end=&quot;2195&quot; data-start=&quot;2160&quot;&gt;
&lt;p data-end=&quot;2195&quot; data-start=&quot;2163&quot;&gt;Klik &lt;strong data-end=&quot;2195&quot; data-start=&quot;2168&quot;&gt;Deploy → New deployment&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2222&quot; data-start=&quot;2196&quot;&gt;
&lt;p data-end=&quot;2222&quot; data-start=&quot;2199&quot;&gt;Pilih type: &lt;strong data-end=&quot;2222&quot; data-start=&quot;2211&quot;&gt;Web app&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2234&quot; data-start=&quot;2223&quot;&gt;
&lt;p data-end=&quot;2234&quot; data-start=&quot;2226&quot;&gt;Isi nama&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2242&quot; data-start=&quot;2235&quot;&gt;
&lt;p data-end=&quot;2242&quot; data-start=&quot;2238&quot;&gt;Set:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul data-end=&quot;2311&quot; data-start=&quot;2243&quot;&gt;
&lt;li data-end=&quot;2263&quot; data-start=&quot;2243&quot;&gt;
&lt;p data-end=&quot;2263&quot; data-start=&quot;2245&quot;&gt;&lt;strong data-end=&quot;2260&quot; data-start=&quot;2245&quot;&gt;Execute as:&lt;/strong&gt; Me&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2311&quot; data-start=&quot;2264&quot;&gt;
&lt;p data-end=&quot;2311&quot; data-start=&quot;2266&quot;&gt;&lt;strong data-end=&quot;2285&quot; data-start=&quot;2266&quot;&gt;Who has access:&lt;/strong&gt; Anyone / Anyone with link&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol data-end=&quot;2330&quot; data-start=&quot;2312&quot; start=&quot;5&quot;&gt;
&lt;li data-end=&quot;2330&quot; data-start=&quot;2312&quot;&gt;
&lt;p data-end=&quot;2330&quot; data-start=&quot;2315&quot;&gt;Klik &lt;strong data-end=&quot;2330&quot; data-start=&quot;2320&quot;&gt;Deploy&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2384&quot; data-start=&quot;2332&quot;&gt;GAS akan memberikan URL. Itulah alamat Web App kita!&lt;/p&gt;&lt;p data-end=&quot;2384&quot; data-start=&quot;2332&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj_-eUPdvFYLoTldN9fmKel2at7qZtmhnFPbzI8LCPM04kTYJEKJTz18nSGTQz85a_37eWxfJXSzebTty72oTzAG9ejithIktyEjjVrMX_n3XHvMYm_RSZgpqwa7cNSaLsZcgj0P3NII937ayhMRZK_JvFAWpTJqk8ogrNVx9OIojbTYLjGb_m2hNDC-sU-&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Halaman Web dengan Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj_-eUPdvFYLoTldN9fmKel2at7qZtmhnFPbzI8LCPM04kTYJEKJTz18nSGTQz85a_37eWxfJXSzebTty72oTzAG9ejithIktyEjjVrMX_n3XHvMYm_RSZgpqwa7cNSaLsZcgj0P3NII937ayhMRZK_JvFAWpTJqk8ogrNVx9OIojbTYLjGb_m2hNDC-sU-=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2389&quot; data-start=&quot;2386&quot; /&gt;
&lt;h2 data-end=&quot;2424&quot; data-start=&quot;2391&quot;&gt;✅ 6. Menambahkan HTML Terpisah&lt;/h2&gt;
&lt;p data-end=&quot;2481&quot; data-start=&quot;2426&quot;&gt;Daripada menulis HTML dalam string, kita bisa pisahkan:&lt;/p&gt;
&lt;h3 data-end=&quot;2503&quot; data-start=&quot;2483&quot;&gt;&lt;strong data-end=&quot;2503&quot; data-start=&quot;2487&quot;&gt;File Code.gs&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2607&quot; data-start=&quot;2504&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;doGet&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;HtmlService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createTemplateFromFile&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;index&quot;&lt;/span&gt;).evaluate();
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;2632&quot; data-start=&quot;2609&quot;&gt;&lt;strong data-end=&quot;2632&quot; data-start=&quot;2613&quot;&gt;File index.html&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2735&quot; data-start=&quot;2633&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-meta&quot;&gt;&amp;lt;!DOCTYPE &lt;span class=&quot;hljs-keyword&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;h2&lt;/span&gt;&lt;/span&gt;&amp;gt;Halo dunia dari index.html!&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;h2&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhgAhSO6_aVYdtGX5wLUOMt0uQO_K7GUY-VF6Ez52-UwEIRjEVWz4lmUI6KwB1WU6XBcOZKgcUWkmCk5UMw3DoD_pKxpWHpM0NRflWNwMQ-hTaK9WznQa4F1i0Tfqpbtp4IKlxb1aO_F2fbcvj5-F_n6SNHDFRmCDs_s2vPxVHXBzpvw3prw3uO0yPTOoZY&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Halaman dengan html dan google apps script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhgAhSO6_aVYdtGX5wLUOMt0uQO_K7GUY-VF6Ez52-UwEIRjEVWz4lmUI6KwB1WU6XBcOZKgcUWkmCk5UMw3DoD_pKxpWHpM0NRflWNwMQ-hTaK9WznQa4F1i0Tfqpbtp4IKlxb1aO_F2fbcvj5-F_n6SNHDFRmCDs_s2vPxVHXBzpvw3prw3uO0yPTOoZY=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2740&quot; data-start=&quot;2737&quot; /&gt;
&lt;h2 data-end=&quot;2791&quot; data-start=&quot;2742&quot;&gt;✅ 7. Komunikasi HTML → GAS (google.script.run)&lt;/h2&gt;
&lt;p data-end=&quot;2857&quot; data-start=&quot;2793&quot;&gt;HTML dapat memanggil fungsi GAS menggunakan &lt;code data-end=&quot;2856&quot; data-start=&quot;2837&quot;&gt;google.script.run&lt;/code&gt;.&lt;/p&gt;
&lt;h3 data-end=&quot;2874&quot; data-start=&quot;2859&quot;&gt;&lt;strong data-end=&quot;2874&quot; data-start=&quot;2863&quot;&gt;Code.gs&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2944&quot; data-start=&quot;2875&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;hello&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;name&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;`Halo, &lt;span class=&quot;hljs-subst&quot;&gt;${name}&lt;/span&gt;&lt;/span&gt;!`;
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;2964&quot; data-start=&quot;2946&quot;&gt;&lt;strong data-end=&quot;2964&quot; data-start=&quot;2950&quot;&gt;index.html&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3428&quot; data-start=&quot;2965&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-meta&quot;&gt;&amp;lt;!DOCTYPE &lt;span class=&quot;hljs-keyword&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;input&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;nama&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;Nama&quot;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;send()&quot;&lt;/span&gt;&amp;gt;Kirim&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;result&quot;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;language-javascript&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;send&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
        &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; nama = &lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;nama&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;;

        google.&lt;span class=&quot;hljs-property&quot;&gt;script&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;run&lt;/span&gt;
          .&lt;span class=&quot;hljs-title function_&quot;&gt;withSuccessHandler&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;res&lt;/span&gt;){
            &lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;result&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-property&quot;&gt;innerHTML&lt;/span&gt; = res;
          })
          .&lt;span class=&quot;hljs-title function_&quot;&gt;hello&lt;/span&gt;(nama);
      }
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3493&quot; data-start=&quot;3430&quot;&gt;Sekarang kita sudah bisa memanggil fungsi GAS dari halaman web!&lt;/p&gt;&lt;p data-end=&quot;3493&quot; data-start=&quot;3430&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjfhjQX_L8WObxxDHBVUxgX8rwEL0E0C9S3sjj4fSO-d5SLrD0s391wxMVEIHPmHlr0Wq4A8ILP8wMtJHMMwRitkHO4gGD_nxmnCibJjJrkG_Db-0F72qssuwpeUnTbKZbuKKm-PuKGBFv9YqZA-RSn99jO73vT-c0_wpe28SHe4lmmB_3nCg0P4Qb1Tc9j&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Halaman web input nama&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjfhjQX_L8WObxxDHBVUxgX8rwEL0E0C9S3sjj4fSO-d5SLrD0s391wxMVEIHPmHlr0Wq4A8ILP8wMtJHMMwRitkHO4gGD_nxmnCibJjJrkG_Db-0F72qssuwpeUnTbKZbuKKm-PuKGBFv9YqZA-RSn99jO73vT-c0_wpe28SHe4lmmB_3nCg0P4Qb1Tc9j=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3498&quot; data-start=&quot;3495&quot; /&gt;
&lt;h2 data-end=&quot;3529&quot; data-start=&quot;3500&quot;&gt;✅ 8. Contoh Web App Mini&lt;/h2&gt;
&lt;h3 data-end=&quot;3568&quot; data-start=&quot;3530&quot;&gt;Form input → simpan ke Spreadsheet&lt;/h3&gt;
&lt;h3 data-end=&quot;3587&quot; data-start=&quot;3570&quot;&gt;✅ &lt;strong data-end=&quot;3587&quot; data-start=&quot;3576&quot;&gt;Code.gs&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3867&quot; data-start=&quot;3588&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;hljs-variable constant_&quot;&gt;SHEET&lt;/span&gt; = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActive&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getSheetByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Data&quot;&lt;/span&gt;);

&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;doGet&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;HtmlService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createTemplateFromFile&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;form&quot;&lt;/span&gt;).evaluate();
}

&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;simpan&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;data&lt;/span&gt;) {
  &lt;span class=&quot;hljs-variable constant_&quot;&gt;SHEET&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;appendRow&lt;/span&gt;([&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;(), data.&lt;span class=&quot;hljs-property&quot;&gt;nama&lt;/span&gt;, data.&lt;span class=&quot;hljs-property&quot;&gt;email&lt;/span&gt;]);
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;Data tersimpan!&quot;&lt;/span&gt;;
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;3888&quot; data-start=&quot;3869&quot;&gt;✅ &lt;strong data-end=&quot;3888&quot; data-start=&quot;3875&quot;&gt;form.html&lt;/strong&gt;&lt;/h3&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4529&quot; data-start=&quot;3889&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-meta&quot;&gt;&amp;lt;!DOCTYPE &lt;span class=&quot;hljs-keyword&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;h2&lt;/span&gt;&lt;/span&gt;&amp;gt;Form Input&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;h2&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;label&lt;/span&gt;&lt;/span&gt;&amp;gt;Nama:&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;label&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;input&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;nama&quot;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;br&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;br&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;label&lt;/span&gt;&lt;/span&gt;&amp;gt;Email:&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;label&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;input&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;email&quot;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;br&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;br&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;submit()&quot;&lt;/span&gt;&amp;gt;Simpan&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;res&quot;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;

    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;language-javascript&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;submit&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
        &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = {
          &lt;span class=&quot;hljs-attr&quot;&gt;nama&lt;/span&gt;: &lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;nama&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;,
          &lt;span class=&quot;hljs-attr&quot;&gt;email&lt;/span&gt;: &lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;email&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;
        };

        google.&lt;span class=&quot;hljs-property&quot;&gt;script&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;run&lt;/span&gt;
          .&lt;span class=&quot;hljs-title function_&quot;&gt;withSuccessHandler&lt;/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-params&quot;&gt;res&lt;/span&gt;&lt;/span&gt; =&amp;gt; {
            &lt;span class=&quot;hljs-variable language_&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getElementById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;res&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-property&quot;&gt;innerHTML&lt;/span&gt; = res;
          })
          .&lt;span class=&quot;hljs-title function_&quot;&gt;simpan&lt;/span&gt;(data);
      }
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4592&quot; data-start=&quot;4531&quot;&gt;✅ Hasil: Data dari form akan otomatis masuk ke Google Sheets.&lt;/p&gt;&lt;p data-end=&quot;4592&quot; data-start=&quot;4531&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh1Enw77pBjxEWG4mfDAQX-ieaTHsq8H-GIBC4CQV_DBzcA1V7prrEpwbK8-1wJTAFNRDqrOozv_4eOGPryzD2p8WmoPcviI6H3WRQ6dmweEDR6VymENa4rrWYLfxAFqrop-vytH3vfXrj2vY0GQnTyga8FHUkdRLTDSNo6gmYik0f43iNLTcdLXGv6kOEf&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Form Input&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh1Enw77pBjxEWG4mfDAQX-ieaTHsq8H-GIBC4CQV_DBzcA1V7prrEpwbK8-1wJTAFNRDqrOozv_4eOGPryzD2p8WmoPcviI6H3WRQ6dmweEDR6VymENa4rrWYLfxAFqrop-vytH3vfXrj2vY0GQnTyga8FHUkdRLTDSNo6gmYik0f43iNLTcdLXGv6kOEf=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhlSkOR_7TRZ4qlGcfEj8thPxv5dW5lZUYH9MVVj777jKw3KVM_DncDzg_MwhlOo2iEV-7F7hwYxmfQJt_-bK-vynrlUtxEuk9HFf9yzf5Gb15ltr_7K22B2qz_RqRVhpCjPVS3-AikFiZ9Wb2xkcCRlQ26bE7QO0IsRZRLIXfqDZhUxe5q07tFLhZGBJc6&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Hasil input&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhlSkOR_7TRZ4qlGcfEj8thPxv5dW5lZUYH9MVVj777jKw3KVM_DncDzg_MwhlOo2iEV-7F7hwYxmfQJt_-bK-vynrlUtxEuk9HFf9yzf5Gb15ltr_7K22B2qz_RqRVhpCjPVS3-AikFiZ9Wb2xkcCRlQ26bE7QO0IsRZRLIXfqDZhUxe5q07tFLhZGBJc6=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;4597&quot; data-start=&quot;4594&quot; /&gt;
&lt;h2 data-end=&quot;4634&quot; data-start=&quot;4599&quot;&gt;✅ 9. Mengembalikan JSON Response&lt;/h2&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4849&quot; data-start=&quot;4636&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;doGet&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = { &lt;span class=&quot;hljs-attr&quot;&gt;pesan&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&quot;Halo JSON&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-attr&quot;&gt;tanggal&lt;/span&gt;: &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;() };
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;ContentService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createTextOutput&lt;/span&gt;(&lt;span class=&quot;hljs-title class_&quot;&gt;JSON&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;stringify&lt;/span&gt;(data))
       .&lt;span class=&quot;hljs-title function_&quot;&gt;setMimeType&lt;/span&gt;(&lt;span class=&quot;hljs-title class_&quot;&gt;ContentService&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;MimeType&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;JSON&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiv1NN3MIAWMCMH6b1GvCoNBP8qY0qTWlclh4yKpkgN0mYokfqhy4LyP-v7ZSYG-00MPKpEXupklvoyCs0G9TnkEzXQB6xnLvHjA0WDgsgsUgxnHH7hqgkIuldB13eya-rTtlL7nx4byVJeD9DWw5GFRA8uO_WKPvZx6EYTI5Pf7gSpgUzq670nUL4o_pKi&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;return json&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiv1NN3MIAWMCMH6b1GvCoNBP8qY0qTWlclh4yKpkgN0mYokfqhy4LyP-v7ZSYG-00MPKpEXupklvoyCs0G9TnkEzXQB6xnLvHjA0WDgsgsUgxnHH7hqgkIuldB13eya-rTtlL7nx4byVJeD9DWw5GFRA8uO_WKPvZx6EYTI5Pf7gSpgUzq670nUL4o_pKi=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;4854&quot; data-start=&quot;4851&quot; /&gt;
&lt;h2 data-end=&quot;4877&quot; data-start=&quot;4856&quot;&gt;✅ 10. Tips Penting&lt;/h2&gt;
&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;div class=&quot;group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse&quot; tabindex=&quot;-1&quot;&gt;&lt;table class=&quot;w-fit min-w-(--thread-content-width)&quot; data-end=&quot;5045&quot; data-start=&quot;4879&quot;&gt;&lt;thead data-end=&quot;4887&quot; data-start=&quot;4879&quot;&gt;&lt;tr data-end=&quot;4887&quot; data-start=&quot;4879&quot;&gt;&lt;th data-col-size=&quot;md&quot; data-end=&quot;4887&quot; data-start=&quot;4879&quot;&gt;Tips&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-end=&quot;5045&quot; data-start=&quot;4897&quot;&gt;&lt;tr data-end=&quot;4933&quot; data-start=&quot;4897&quot;&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;4933&quot; data-start=&quot;4897&quot;&gt;Gunakan &lt;code data-end=&quot;4920&quot; data-start=&quot;4907&quot;&gt;HtmlService&lt;/code&gt; untuk HTML&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;4966&quot; data-start=&quot;4934&quot;&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;4966&quot; data-start=&quot;4934&quot;&gt;Pisahkan HTML &amp;amp; GS agar rapi&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;5015&quot; data-start=&quot;4967&quot;&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;5015&quot; data-start=&quot;4967&quot;&gt;Gunakan &lt;code data-end=&quot;4996&quot; data-start=&quot;4977&quot;&gt;google.script.run&lt;/code&gt; untuk komunikasi&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;5045&quot; data-start=&quot;5016&quot;&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;5045&quot; data-start=&quot;5016&quot;&gt;Log pakai &lt;code data-end=&quot;5043&quot; data-start=&quot;5028&quot;&gt;console.log()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr data-end=&quot;5050&quot; data-start=&quot;5047&quot; /&gt;
&lt;h2 data-end=&quot;5073&quot; data-start=&quot;5052&quot;&gt;✅ Catatan Keamanan&lt;/h2&gt;
&lt;p data-end=&quot;5104&quot; data-start=&quot;5075&quot;&gt;Jika data sensitif → gunakan:&lt;/p&gt;
&lt;ul data-end=&quot;5188&quot; data-start=&quot;5105&quot;&gt;
&lt;li data-end=&quot;5135&quot; data-start=&quot;5105&quot;&gt;
&lt;p data-end=&quot;5135&quot; data-start=&quot;5107&quot;&gt;Limited access (domain-only)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5148&quot; data-start=&quot;5136&quot;&gt;
&lt;p data-end=&quot;5148&quot; data-start=&quot;5138&quot;&gt;Validation&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5188&quot; data-start=&quot;5149&quot;&gt;
&lt;p data-end=&quot;5188&quot; data-start=&quot;5151&quot;&gt;Jangan expose fungsi sensitif di HTML&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;5193&quot; data-start=&quot;5190&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Di seri ini kita belajar membuat aplikasi web sederhana menggunakan Google Apps Script:&lt;/p&gt;
&lt;p data-end=&quot;5463&quot; data-start=&quot;5301&quot;&gt;✔ Konsep Web App (GET/POST)&lt;br data-end=&quot;5331&quot; data-start=&quot;5328&quot; /&gt;
✔ Fungsi dasar &lt;code data-end=&quot;5355&quot; data-start=&quot;5346&quot;&gt;doGet()&lt;/code&gt; dan &lt;code data-end=&quot;5370&quot; data-start=&quot;5360&quot;&gt;doPost()&lt;/code&gt;&lt;br data-end=&quot;5373&quot; data-start=&quot;5370&quot; /&gt;
✔ Output HTML&lt;br data-end=&quot;5389&quot; data-start=&quot;5386&quot; /&gt;
✔ File HTML terpisah&lt;br data-end=&quot;5412&quot; data-start=&quot;5409&quot; /&gt;
✔ Komunikasi HTML ↔ GAS&lt;br data-end=&quot;5438&quot; data-start=&quot;5435&quot; /&gt;
✔ Example: Form → Sheet&lt;/p&gt;
&lt;p data-end=&quot;5595&quot; data-start=&quot;5465&quot;&gt;Dengan kemampuan ini, kita bisa mulai membangun berbagai solusi:&lt;br /&gt;
✅ Form internal&lt;br data-end=&quot;5548&quot; data-start=&quot;5545&quot; /&gt;
✅ Portal mini&lt;br data-end=&quot;5564&quot; data-start=&quot;5561&quot; /&gt;
✅ Dashboard&lt;br data-end=&quot;5578&quot; data-start=&quot;5575&quot; /&gt;
✅ Integrasi API&lt;/p&gt;
&lt;p data-end=&quot;5661&quot; data-start=&quot;5597&quot;&gt;Mulai dari administrasi kantor, sekolah, hingga workflow bisnis!&lt;/p&gt;&lt;p data-end=&quot;5661&quot; data-start=&quot;5597&quot;&gt;Pada artikel berikutnya kita akan belajar Membuat Dashboard Visual dari Data Spreadsheet&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/700512428056526931/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/11/seri-9-membuat-web-app-dengan-google.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/700512428056526931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/700512428056526931'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/11/seri-9-membuat-web-app-dengan-google.html' title='Seri 9 — Membuat Web App dengan Google Apps Script'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEj_-eUPdvFYLoTldN9fmKel2at7qZtmhnFPbzI8LCPM04kTYJEKJTz18nSGTQz85a_37eWxfJXSzebTty72oTzAG9ejithIktyEjjVrMX_n3XHvMYm_RSZgpqwa7cNSaLsZcgj0P3NII937ayhMRZK_JvFAWpTJqk8ogrNVx9OIojbTYLjGb_m2hNDC-sU-=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-6963392190149366949</id><published>2025-11-04T13:49:00.005+07:00</published><updated>2025-11-05T05:22:51.875+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 8: Menghubungkan Google Apps Script dengan API Eksternal</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri sebelumnya, kita sudah belajar &lt;a href=&quot;/2025/10/seri-7-membuat-add-on-sederhana-untuk.html&quot;&gt;Membuat Add-on Sederhana untuk Google Sheets&lt;/a&gt;. Pada seri ini kita akan belajar:&lt;/p&gt;
&lt;ul data-end=&quot;842&quot; data-start=&quot;578&quot;&gt;
&lt;li data-end=&quot;632&quot; data-start=&quot;578&quot;&gt;
&lt;p data-end=&quot;632&quot; data-start=&quot;580&quot;&gt;Apa itu API dan bagaimana cara kerja HTTP Request.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;690&quot; data-start=&quot;633&quot;&gt;
&lt;p data-end=&quot;690&quot; data-start=&quot;635&quot;&gt;Cara menggunakan &lt;code data-end=&quot;665&quot; data-start=&quot;652&quot;&gt;UrlFetchApp&lt;/code&gt; di Google Apps Script.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;742&quot; data-start=&quot;691&quot;&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;693&quot;&gt;Mengambil data dari API publik (contoh: cuaca).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;796&quot; data-start=&quot;743&quot;&gt;
&lt;p data-end=&quot;796&quot; data-start=&quot;745&quot;&gt;Mengirim data ke API eksternal (contoh: webhook).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;842&quot; data-start=&quot;797&quot;&gt;
&lt;p data-end=&quot;842&quot; data-start=&quot;799&quot;&gt;Menampilkan hasilnya di Google Spreadsheet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;847&quot; data-start=&quot;844&quot; /&gt;
&lt;h2 data-end=&quot;870&quot; data-start=&quot;849&quot;&gt;⚙️ 1. Apa Itu API?&lt;/h2&gt;
&lt;p data-end=&quot;995&quot; data-start=&quot;872&quot;&gt;&lt;strong data-end=&quot;915&quot; data-start=&quot;872&quot;&gt;API (Application Programming Interface)&lt;/strong&gt; adalah jembatan yang memungkinkan satu aplikasi berbicara dengan aplikasi lain.&lt;/p&gt;
&lt;p data-end=&quot;1006&quot; data-start=&quot;997&quot;&gt;Misalnya:&lt;/p&gt;
&lt;ul data-end=&quot;1182&quot; data-start=&quot;1007&quot;&gt;
&lt;li data-end=&quot;1066&quot; data-start=&quot;1007&quot;&gt;
&lt;p data-end=&quot;1066&quot; data-start=&quot;1009&quot;&gt;Kita bisa mengambil data cuaca dari OpenWeatherMap API.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1125&quot; data-start=&quot;1067&quot;&gt;
&lt;p data-end=&quot;1125&quot; data-start=&quot;1069&quot;&gt;Mengirim pesan ke Telegram atau WhatsApp Business API.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1182&quot; data-start=&quot;1126&quot;&gt;
&lt;p data-end=&quot;1182&quot; data-start=&quot;1128&quot;&gt;Mengirim data penjualan ke sistem internal perusahaan.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1313&quot; data-start=&quot;1184&quot;&gt;API bekerja dengan cara mengirim &lt;strong data-end=&quot;1246&quot; data-start=&quot;1217&quot;&gt;permintaan HTTP (request)&lt;/strong&gt; dan menerima &lt;strong data-end=&quot;1282&quot; data-start=&quot;1260&quot;&gt;balasan (response)&lt;/strong&gt; dalam format seperti &lt;strong data-end=&quot;1312&quot; data-start=&quot;1304&quot;&gt;JSON&lt;/strong&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;1318&quot; data-start=&quot;1315&quot; /&gt;
&lt;h2 data-end=&quot;1355&quot; data-start=&quot;1320&quot;&gt;🔧 2. Fungsi Dasar &lt;code data-end=&quot;1355&quot; data-start=&quot;1342&quot;&gt;UrlFetchApp&lt;/code&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1457&quot; data-start=&quot;1357&quot;&gt;Google Apps Script menyediakan objek bernama &lt;code data-end=&quot;1415&quot; data-start=&quot;1402&quot;&gt;UrlFetchApp&lt;/code&gt; untuk berkomunikasi dengan API eksternal.&lt;/p&gt;
&lt;p data-end=&quot;1476&quot; data-start=&quot;1459&quot;&gt;Sintaks dasarnya:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1545&quot; data-start=&quot;1478&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; response = &lt;span class=&quot;hljs-title class_&quot;&gt;UrlFetchApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;fetch&lt;/span&gt;(url, options);
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ul data-end=&quot;1744&quot; data-start=&quot;1547&quot;&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1547&quot;&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1549&quot;&gt;&lt;code data-end=&quot;1554&quot; data-start=&quot;1549&quot;&gt;url&lt;/code&gt; → alamat API yang ingin diakses.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1674&quot; data-start=&quot;1590&quot;&gt;
&lt;p data-end=&quot;1674&quot; data-start=&quot;1592&quot;&gt;&lt;code data-end=&quot;1601&quot; data-start=&quot;1592&quot;&gt;options&lt;/code&gt; → pengaturan request seperti metode, header, dan payload (jika perlu).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1744&quot; data-start=&quot;1675&quot;&gt;
&lt;p data-end=&quot;1744&quot; data-start=&quot;1677&quot;&gt;&lt;code data-end=&quot;1687&quot; data-start=&quot;1677&quot;&gt;response&lt;/code&gt; → hasil dari server (bisa berupa JSON, teks, atau HTML).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1749&quot; data-start=&quot;1746&quot; /&gt;
&lt;h2 data-end=&quot;1804&quot; data-start=&quot;1751&quot;&gt;☀️ 3. Contoh 1: Mengambil Data Cuaca (GET Request)&lt;/h2&gt;
&lt;p data-end=&quot;1912&quot; data-start=&quot;1806&quot;&gt;Mari kita ambil contoh API publik dari &lt;strong data-end=&quot;1863&quot; data-start=&quot;1845&quot;&gt;OpenWeatherMap&lt;/strong&gt;.&lt;br data-end=&quot;1867&quot; data-start=&quot;1864&quot; /&gt;
Kita akan ambil data suhu terkini di Jakarta.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2371&quot; data-start=&quot;1914&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;ambilDataCuaca&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; apiKey = &lt;span class=&quot;hljs-string&quot;&gt;&#39;ISI_API_KEY_ANDA&#39;&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; city = &lt;span class=&quot;hljs-string&quot;&gt;&#39;Jakarta&#39;&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; url = &lt;span class=&quot;hljs-string&quot;&gt;`https://api.openweathermap.org/data/2.5/weather?q=&lt;span class=&quot;hljs-subst&quot;&gt;${city}&lt;/span&gt;&lt;/span&gt;&amp;amp;appid=&lt;span class=&quot;hljs-subst&quot;&gt;${apiKey}&lt;/span&gt;&amp;amp;units=metric`;

  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; response = &lt;span class=&quot;hljs-title class_&quot;&gt;UrlFetchApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;fetch&lt;/span&gt;(url);
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = &lt;span class=&quot;hljs-title class_&quot;&gt;JSON&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;parse&lt;/span&gt;(response.&lt;span class=&quot;hljs-title function_&quot;&gt;getContentText&lt;/span&gt;());

  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; suhu = data.&lt;span class=&quot;hljs-property&quot;&gt;main&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;temp&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; kondisi = data.&lt;span class=&quot;hljs-property&quot;&gt;weather&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot;&gt;description&lt;/span&gt;;

  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`Suhu di &lt;span class=&quot;hljs-subst&quot;&gt;${city}&lt;/span&gt;&lt;/span&gt;: &lt;span class=&quot;hljs-subst&quot;&gt;${suhu}&lt;/span&gt;°C, kondisi: &lt;span class=&quot;hljs-subst&quot;&gt;${kondisi}&lt;/span&gt;`);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2391&quot; data-start=&quot;2373&quot;&gt;📘 &lt;strong data-end=&quot;2391&quot; data-start=&quot;2376&quot;&gt;Penjelasan:&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;2592&quot; data-start=&quot;2392&quot;&gt;
&lt;li data-end=&quot;2447&quot; data-start=&quot;2392&quot;&gt;
&lt;p data-end=&quot;2447&quot; data-start=&quot;2394&quot;&gt;&lt;code data-end=&quot;2415&quot; data-start=&quot;2394&quot;&gt;UrlFetchApp.fetch()&lt;/code&gt; → mengirim permintaan ke API.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2513&quot; data-start=&quot;2448&quot;&gt;
&lt;p data-end=&quot;2513&quot; data-start=&quot;2450&quot;&gt;&lt;code data-end=&quot;2464&quot; data-start=&quot;2450&quot;&gt;JSON.parse()&lt;/code&gt; → mengubah teks JSON menjadi objek JavaScript.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2592&quot; data-start=&quot;2514&quot;&gt;
&lt;p data-end=&quot;2592&quot; data-start=&quot;2516&quot;&gt;&lt;code data-end=&quot;2532&quot; data-start=&quot;2516&quot;&gt;data.main.temp&lt;/code&gt; dan &lt;code data-end=&quot;2566&quot; data-start=&quot;2537&quot;&gt;data.weather[0].description&lt;/code&gt; → mengekstrak data cuaca.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2641&quot; data-start=&quot;2594&quot;&gt;Kita bisa menulis hasilnya ke spreadsheet juga:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2789&quot; data-start=&quot;2643&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getSheetByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Cuaca&#39;&lt;/span&gt;);
sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;appendRow&lt;/span&gt;([&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;(), city, suhu, kondisi]);
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2794&quot; data-start=&quot;2791&quot; /&gt;
&lt;h2 data-end=&quot;2850&quot; data-start=&quot;2796&quot;&gt;📮 4. Contoh 2: Mengirim Data ke API (POST Request)&lt;/h2&gt;
&lt;p data-end=&quot;2941&quot; data-start=&quot;2852&quot;&gt;Sekarang, kita akan belajar &lt;strong data-end=&quot;2914&quot; data-start=&quot;2880&quot;&gt;mengirim data ke API eksternal&lt;/strong&gt; menggunakan metode &lt;code data-end=&quot;2940&quot; data-start=&quot;2934&quot;&gt;POST&lt;/code&gt;.&lt;/p&gt;
&lt;p data-end=&quot;3060&quot; data-start=&quot;2943&quot;&gt;Contoh kasus: kita ingin mengirim data ke webhook (misalnya untuk sistem internal atau Discord, Notion, atau Zapier).&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3568&quot; data-start=&quot;3062&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;kirimDataKeAPI&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; url = &lt;span class=&quot;hljs-string&quot;&gt;&#39;https://webhook.site/xxxxxx&#39;&lt;/span&gt;; &lt;span class=&quot;hljs-comment&quot;&gt;// Ganti dengan URL webhook Anda&lt;/span&gt;
  
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = {
    &lt;span class=&quot;hljs-attr&quot;&gt;nama&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&#39;Bagus Prasojo&#39;&lt;/span&gt;,
    &lt;span class=&quot;hljs-attr&quot;&gt;waktu&lt;/span&gt;: &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;toISOString&lt;/span&gt;(),
    &lt;span class=&quot;hljs-attr&quot;&gt;pesan&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&#39;Percobaan kirim data dari Google Apps Script!&#39;&lt;/span&gt;
  };

  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; options = {
    &lt;span class=&quot;hljs-attr&quot;&gt;method&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&#39;POST&#39;&lt;/span&gt;,
    &lt;span class=&quot;hljs-attr&quot;&gt;contentType&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&#39;application/json&#39;&lt;/span&gt;,
    &lt;span class=&quot;hljs-attr&quot;&gt;payload&lt;/span&gt;: &lt;span class=&quot;hljs-title class_&quot;&gt;JSON&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;stringify&lt;/span&gt;(data)
  };

  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; response = &lt;span class=&quot;hljs-title class_&quot;&gt;UrlFetchApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;fetch&lt;/span&gt;(url, options);
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Response server: &#39;&lt;/span&gt; + response.&lt;span class=&quot;hljs-title function_&quot;&gt;getContentText&lt;/span&gt;());
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3588&quot; data-start=&quot;3570&quot;&gt;📘 &lt;strong data-end=&quot;3588&quot; data-start=&quot;3573&quot;&gt;Penjelasan:&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;3761&quot; data-start=&quot;3589&quot;&gt;
&lt;li data-end=&quot;3637&quot; data-start=&quot;3589&quot;&gt;
&lt;p data-end=&quot;3637&quot; data-start=&quot;3591&quot;&gt;&lt;code data-end=&quot;3607&quot; data-start=&quot;3591&quot;&gt;method: &#39;POST&#39;&lt;/code&gt; → menentukan jenis request.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3712&quot; data-start=&quot;3638&quot;&gt;
&lt;p data-end=&quot;3712&quot; data-start=&quot;3640&quot;&gt;&lt;code data-end=&quot;3673&quot; data-start=&quot;3640&quot;&gt;contentType: &#39;application/json&#39;&lt;/code&gt; → memberitahu server format datanya.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3761&quot; data-start=&quot;3713&quot;&gt;
&lt;p data-end=&quot;3761&quot; data-start=&quot;3715&quot;&gt;&lt;code data-end=&quot;3724&quot; data-start=&quot;3715&quot;&gt;payload&lt;/code&gt; → isi body yang kita kirim ke API.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3843&quot; data-start=&quot;3763&quot;&gt;Dengan ini, setiap kali fungsi dijalankan, data JSON akan dikirim ke URL tujuan.&lt;/p&gt;
&lt;hr data-end=&quot;3848&quot; data-start=&quot;3845&quot; /&gt;
&lt;h2 data-end=&quot;3905&quot; data-start=&quot;3850&quot;&gt;🔐 5. Menggunakan Header Otorisasi (API Key / Token)&lt;/h2&gt;
&lt;p data-end=&quot;4057&quot; data-start=&quot;3907&quot;&gt;Beberapa API membutuhkan autentikasi, misalnya API cuaca, WhatsApp API, atau Telegram Bot.&lt;br data-end=&quot;4000&quot; data-start=&quot;3997&quot; /&gt;
Biasanya kita perlu menambahkan &lt;strong data-end=&quot;4056&quot; data-start=&quot;4032&quot;&gt;header Authorization&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;4066&quot; data-start=&quot;4059&quot;&gt;Contoh:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4437&quot; data-start=&quot;4068&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;ambilDataDenganToken&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; url = &lt;span class=&quot;hljs-string&quot;&gt;&#39;https://api.example.com/data&#39;&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; token = &lt;span class=&quot;hljs-string&quot;&gt;&#39;Bearer 1234567890abcdef&#39;&lt;/span&gt;;

  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; options = {
    &lt;span class=&quot;hljs-attr&quot;&gt;method&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot;&gt;&#39;GET&#39;&lt;/span&gt;,
    &lt;span class=&quot;hljs-attr&quot;&gt;headers&lt;/span&gt;: {
      &lt;span class=&quot;hljs-string&quot;&gt;&#39;Authorization&#39;&lt;/span&gt;: token
    }
  };

  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; response = &lt;span class=&quot;hljs-title class_&quot;&gt;UrlFetchApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;fetch&lt;/span&gt;(url, options);
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; result = &lt;span class=&quot;hljs-title class_&quot;&gt;JSON&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;parse&lt;/span&gt;(response.&lt;span class=&quot;hljs-title function_&quot;&gt;getContentText&lt;/span&gt;());

  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(result);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;4442&quot; data-start=&quot;4439&quot; /&gt;
&lt;h2 data-end=&quot;4505&quot; data-start=&quot;4444&quot;&gt;🧩 6. Contoh Kasus Nyata: Menampilkan Data Cuaca dari BMKG menggunakan API&lt;/h2&gt;
&lt;p data-end=&quot;4581&quot; data-start=&quot;4507&quot;&gt;Kita bisa ambil data dari API publik seperti milik BMKG&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;5063&quot; data-start=&quot;4583&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #bbbbbb; font-family: &amp;quot;Roboto Mono&amp;quot;, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; line-height: 18px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;ambilDataCuacaBMKG&lt;/span&gt;() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;url&lt;/span&gt; = &lt;span style=&quot;color: #6a8759;&quot;&gt;`https://api.bmkg.go.id/publik/prakiraan-cuaca?adm4=31.71.03.1001`&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;response&lt;/span&gt; = &lt;span style=&quot;color: #ffc66d;&quot;&gt;UrlFetchApp&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;fetch&lt;/span&gt;(&lt;span style=&quot;color: #b589cc;&quot;&gt;url&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #cc7832;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt; = &lt;span style=&quot;color: #ffc66d;&quot;&gt;JSON&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color: #b589cc;&quot;&gt;response&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;getContentText&lt;/span&gt;());&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #ffc66d;&quot;&gt;Logger&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;Provinsi : &#39;&lt;/span&gt; + &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;lokasi&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;provinsi&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #ffc66d;&quot;&gt;Logger&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;Kota/Kab : &#39;&lt;/span&gt; + &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;lokasi&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;kotkab&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #ffc66d;&quot;&gt;Logger&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;Kecamatan : &#39;&lt;/span&gt; + &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;lokasi&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;kecamatan&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #ffc66d;&quot;&gt;Logger&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;Desa : &#39;&lt;/span&gt; + &lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;lokasi&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;desa&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #ffc66d;&quot;&gt;Logger&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;------------------------------ C U A C A -------------------------------&#39;&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style=&quot;color: #ffc66d;&quot;&gt;Logger&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;.&lt;span style=&quot;color: #b589cc;&quot;&gt;data&lt;/span&gt;[&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;].&lt;span style=&quot;color: #b589cc;&quot;&gt;cuaca&lt;/span&gt;[&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;][&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;]);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;5159&quot; data-start=&quot;5065&quot;&gt;Script di atas akan menampilkan data cuaca yang diambil dari data BMKG ke dalam log&lt;/p&gt;&lt;p data-end=&quot;5159&quot; data-start=&quot;5065&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgkbLzyyZEmZZFKbQ12GwMIYPGzZfvlX8f8PBKxtg5SlZeT74YIO8V3jM6eS9sU0ZIB3-qxEkR0KaQOeEhgaHy7BqwIraZsXWx1OGsa1A7lPlcydnAeiEILFY8bfNbJ48ItlLv_P6bJ0u_xFwK6PKUiFIWN86TAlGyznrdvV0-XPaYhbVgkZ9Rraj6YMHXf&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Cuaca dari BMKG&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgkbLzyyZEmZZFKbQ12GwMIYPGzZfvlX8f8PBKxtg5SlZeT74YIO8V3jM6eS9sU0ZIB3-qxEkR0KaQOeEhgaHy7BqwIraZsXWx1OGsa1A7lPlcydnAeiEILFY8bfNbJ48ItlLv_P6bJ0u_xFwK6PKUiFIWN86TAlGyznrdvV0-XPaYhbVgkZ9Rraj6YMHXf=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;5164&quot; data-start=&quot;5161&quot; /&gt;
&lt;h2 data-end=&quot;5199&quot; data-start=&quot;5166&quot;&gt;🧠 7. Tips dan Praktik Terbaik&lt;/h2&gt;
&lt;p data-end=&quot;5253&quot; data-start=&quot;5201&quot;&gt;✅ Gunakan &lt;code data-end=&quot;5224&quot; data-start=&quot;5211&quot;&gt;try...catch&lt;/code&gt; untuk menangani error API:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;5368&quot; data-start=&quot;5254&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt; {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; res = &lt;span class=&quot;hljs-title class_&quot;&gt;UrlFetchApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;fetch&lt;/span&gt;(url);
} &lt;span class=&quot;hljs-keyword&quot;&gt;catch&lt;/span&gt; (e) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Terjadi error: &#39;&lt;/span&gt; + e);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;5442&quot; data-start=&quot;5370&quot;&gt;✅ Gunakan &lt;code data-end=&quot;5399&quot; data-start=&quot;5380&quot;&gt;PropertiesService&lt;/code&gt; untuk menyimpan API key agar lebih aman:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;5604&quot; data-start=&quot;5443&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; props = &lt;span class=&quot;hljs-title class_&quot;&gt;PropertiesService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getScriptProperties&lt;/span&gt;();
props.&lt;span class=&quot;hljs-title function_&quot;&gt;setProperty&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;API_KEY&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;12345ABCDE&#39;&lt;/span&gt;);
&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; apiKey = props.&lt;span class=&quot;hljs-title function_&quot;&gt;getProperty&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;API_KEY&#39;&lt;/span&gt;);
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;5668&quot; data-start=&quot;5606&quot;&gt;✅ Gunakan &lt;code data-end=&quot;5630&quot; data-start=&quot;5616&quot;&gt;JSON.parse()&lt;/code&gt; hanya untuk data dalam format JSON.&lt;/p&gt;
&lt;p data-end=&quot;5752&quot; data-start=&quot;5670&quot;&gt;✅ Gunakan &lt;code data-end=&quot;5720&quot; data-start=&quot;5680&quot;&gt;Logger.log(response.getResponseCode())&lt;/code&gt; untuk memeriksa status request.&lt;/p&gt;
&lt;hr data-end=&quot;5757&quot; data-start=&quot;5754&quot; /&gt;
&lt;h2 data-end=&quot;5775&quot; data-start=&quot;5759&quot;&gt;📚 Kesimpulan&lt;/h2&gt;
&lt;p data-end=&quot;5808&quot; data-start=&quot;5777&quot;&gt;Di seri ini kita sudah belajar:&lt;/p&gt;
&lt;ul data-end=&quot;6006&quot; data-start=&quot;5809&quot;&gt;
&lt;li data-end=&quot;5855&quot; data-start=&quot;5809&quot;&gt;
&lt;p data-end=&quot;5855&quot; data-start=&quot;5811&quot;&gt;Dasar komunikasi antar sistem melalui API.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5890&quot; data-start=&quot;5856&quot;&gt;
&lt;p data-end=&quot;5890&quot; data-start=&quot;5858&quot;&gt;Mengambil data dari API (GET).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5923&quot; data-start=&quot;5891&quot;&gt;
&lt;p data-end=&quot;5923&quot; data-start=&quot;5893&quot;&gt;Mengirim data ke API (POST).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5963&quot; data-start=&quot;5924&quot;&gt;
&lt;p data-end=&quot;5963&quot; data-start=&quot;5926&quot;&gt;Menambahkan header otorisasi/token.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;6006&quot; data-start=&quot;5964&quot;&gt;
&lt;p data-end=&quot;6006&quot; data-start=&quot;5966&quot;&gt;Menyimpan hasil ke Google Spreadsheet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6211&quot; data-start=&quot;6008&quot;&gt;Dengan kemampuan ini, Google Apps Script bisa menjadi &lt;strong data-end=&quot;6088&quot; data-start=&quot;6062&quot;&gt;hub integrasi otomatis&lt;/strong&gt; antara Google Workspace dan layanan eksternal — dari laporan keuangan, notifikasi, chatbot, hingga sistem bisnis internal.&lt;/p&gt;
&lt;hr data-end=&quot;6216&quot; data-start=&quot;6213&quot; /&gt;
&lt;h2 data-end=&quot;6240&quot; data-start=&quot;6218&quot;&gt;🔜 Seri Selanjutnya&lt;/h2&gt;
&lt;p data-end=&quot;6297&quot; data-start=&quot;6241&quot;&gt;➡️ &lt;strong data-end=&quot;6297&quot; data-start=&quot;6244&quot;&gt;&lt;a href=&quot;/2025/11/seri-9-membuat-web-app-dengan-google.html&quot;&gt;Seri 9: Membuat Web App dengan Google Apps Script&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p data-end=&quot;6537&quot; data-start=&quot;6299&quot;&gt;Kita akan membuat &lt;strong data-end=&quot;6351&quot; data-start=&quot;6317&quot;&gt;aplikasi web mini berbasis GAS&lt;/strong&gt;, lengkap dengan tampilan HTML, form input, dan penyimpanan data ke Spreadsheet.&lt;br data-end=&quot;6434&quot; data-start=&quot;6431&quot; /&gt;
Ini adalah langkah besar menuju pembuatan aplikasi internal berbasis cloud yang mudah diakses oleh tim.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/6963392190149366949/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/11/seri-8-menghubungkan-google-apps-script.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/6963392190149366949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/6963392190149366949'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/11/seri-8-menghubungkan-google-apps-script.html' title='Seri 8: Menghubungkan Google Apps Script dengan API Eksternal'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgkbLzyyZEmZZFKbQ12GwMIYPGzZfvlX8f8PBKxtg5SlZeT74YIO8V3jM6eS9sU0ZIB3-qxEkR0KaQOeEhgaHy7BqwIraZsXWx1OGsa1A7lPlcydnAeiEILFY8bfNbJ48ItlLv_P6bJ0u_xFwK6PKUiFIWN86TAlGyznrdvV0-XPaYhbVgkZ9Rraj6YMHXf=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-234737489844765619</id><published>2025-10-27T04:45:00.000+07:00</published><updated>2025-10-27T04:45:06.152+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 7: Membuat Add-on Sederhana untuk Google Sheets</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri sebelumnya kita telah belajar tentang&amp;nbsp;&lt;a href=&quot;/2025/10/seri-6-mengelola-file-dan-folder-di.html&quot;&gt;Mengelola File dan Folder di Google Drive Secara Otomatis&lt;/a&gt;. Pada seri ini kita akan belajar cara:&lt;/p&gt;
&lt;ul data-end=&quot;623&quot; data-start=&quot;408&quot;&gt;
&lt;li data-end=&quot;484&quot; data-start=&quot;408&quot;&gt;
&lt;p data-end=&quot;484&quot; data-start=&quot;410&quot;&gt;Membuat &lt;strong data-end=&quot;433&quot; data-start=&quot;418&quot;&gt;menu khusus&lt;/strong&gt; di Google Sheets (misalnya “Menu Otomasi Kita”).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;485&quot;&gt;
&lt;p data-end=&quot;543&quot; data-start=&quot;487&quot;&gt;Menjalankan fungsi script langsung dari menu tersebut.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;623&quot; data-start=&quot;544&quot;&gt;
&lt;p data-end=&quot;623&quot; data-start=&quot;546&quot;&gt;(Opsional) Membuat &lt;strong data-end=&quot;582&quot; data-start=&quot;565&quot;&gt;custom dialog&lt;/strong&gt; atau sidebar untuk interaksi pengguna.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;748&quot; data-start=&quot;625&quot;&gt;Dengan begitu, script kita tidak lagi harus dijalankan lewat editor, tapi bisa dipakai layaknya fitur bawaan Google Sheets.&lt;/p&gt;
&lt;hr data-end=&quot;753&quot; data-start=&quot;750&quot; /&gt;
&lt;h2 data-end=&quot;790&quot; data-start=&quot;755&quot;&gt;⚙️ 1. Konsep Dasar Add-on di GAS&lt;/h2&gt;
&lt;p data-end=&quot;921&quot; data-start=&quot;792&quot;&gt;Add-on pada dasarnya hanyalah &lt;strong data-end=&quot;912&quot; data-start=&quot;822&quot;&gt;Google Apps Script yang dihubungkan ke dokumen Google (Spreadsheet, Docs, atau Slides)&lt;/strong&gt;, dengan:&lt;/p&gt;
&lt;ul data-end=&quot;1053&quot; data-start=&quot;922&quot;&gt;
&lt;li data-end=&quot;963&quot; data-start=&quot;922&quot;&gt;
&lt;p data-end=&quot;963&quot; data-start=&quot;924&quot;&gt;Fungsi yang dijalankan oleh pengguna.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;993&quot; data-start=&quot;964&quot;&gt;
&lt;p data-end=&quot;993&quot; data-start=&quot;966&quot;&gt;Menu tambahan di toolbar.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;994&quot;&gt;
&lt;p data-end=&quot;1053&quot; data-start=&quot;996&quot;&gt;(Kadang) tampilan UI tambahan seperti dialog dan sidebar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1058&quot; data-start=&quot;1055&quot; /&gt;
&lt;h2 data-end=&quot;1103&quot; data-start=&quot;1060&quot;&gt;🧱 2. Membuat Menu Kustom di Spreadsheet&lt;/h2&gt;
&lt;p data-end=&quot;1157&quot; data-start=&quot;1105&quot;&gt;Langkah pertama: kita buat menu baru di Spreadsheet.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1475&quot; data-start=&quot;1159&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onOpen&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; ui = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getUi&lt;/span&gt;();
  ui.&lt;span class=&quot;hljs-title function_&quot;&gt;createMenu&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;🔧 Otomasi Kita&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;addItem&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Kirim Email Otomatis&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;kirimEmailOtomatis&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;addItem&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Backup File Drive&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;salinFileKeBackup&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;addSeparator&lt;/span&gt;()
    .&lt;span class=&quot;hljs-title function_&quot;&gt;addItem&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Tentang Add-on Ini&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;tampilkanTentang&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;addToUi&lt;/span&gt;();
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1495&quot; data-start=&quot;1477&quot;&gt;📘 &lt;strong data-end=&quot;1495&quot; data-start=&quot;1480&quot;&gt;Penjelasan:&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;1768&quot; data-start=&quot;1496&quot;&gt;
&lt;li data-end=&quot;1586&quot; data-start=&quot;1496&quot;&gt;
&lt;p data-end=&quot;1586&quot; data-start=&quot;1498&quot;&gt;Fungsi &lt;code data-end=&quot;1515&quot; data-start=&quot;1505&quot;&gt;onOpen()&lt;/code&gt; adalah &lt;strong data-end=&quot;1541&quot; data-start=&quot;1523&quot;&gt;simple trigger&lt;/strong&gt; — akan berjalan otomatis saat file dibuka.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1654&quot; data-start=&quot;1587&quot;&gt;
&lt;p data-end=&quot;1654&quot; data-start=&quot;1589&quot;&gt;&lt;code data-end=&quot;1603&quot; data-start=&quot;1589&quot;&gt;createMenu()&lt;/code&gt; membuat menu baru dengan nama “🔧 Otomasi Kita”.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1715&quot; data-start=&quot;1655&quot;&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1657&quot;&gt;&lt;code data-end=&quot;1687&quot; data-start=&quot;1657&quot;&gt;addItem(label, functionName)&lt;/code&gt; menautkan menu ke fungsi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1768&quot; data-start=&quot;1716&quot;&gt;
&lt;p data-end=&quot;1768&quot; data-start=&quot;1718&quot;&gt;&lt;code data-end=&quot;1729&quot; data-start=&quot;1718&quot;&gt;addToUi()&lt;/code&gt; menambahkan menu ke bar Google Sheets.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1854&quot; data-start=&quot;1770&quot;&gt;Setelah disimpan, menu baru akan muncul otomatis setelah kita &lt;em data-end=&quot;1841&quot; data-start=&quot;1832&quot;&gt;refresh&lt;/em&gt; spreadsheet.&lt;/p&gt;
&lt;hr data-end=&quot;1859&quot; data-start=&quot;1856&quot; /&gt;
&lt;h2 data-end=&quot;1909&quot; data-start=&quot;1861&quot;&gt;📬 3. Menambahkan Fungsi dari Seri Sebelumnya&lt;/h2&gt;
&lt;p data-end=&quot;2049&quot; data-start=&quot;1911&quot;&gt;Agar menu tersebut berfungsi, kita bisa memanggil fungsi dari seri sebelumnya, misalnya &lt;code data-end=&quot;2021&quot; data-start=&quot;1999&quot;&gt;kirimEmailOtomatis()&lt;/code&gt; atau &lt;code data-end=&quot;2048&quot; data-start=&quot;2027&quot;&gt;salinFileKeBackup()&lt;/code&gt;.&lt;/p&gt;
&lt;p data-end=&quot;2071&quot; data-start=&quot;2051&quot;&gt;Misalnya, tambahkan:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2239&quot; data-start=&quot;2073&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tampilkanTentang&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getUi&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;alert&lt;/span&gt;(
    &lt;span class=&quot;hljs-string&quot;&gt;&#39;Add-on Otomasi Kita\n\nDibuat menggunakan Google Apps Script.\nVersi: 1.0&#39;&lt;/span&gt;
  );
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2316&quot; data-start=&quot;2241&quot;&gt;Sekarang menu “Tentang Add-on Ini” akan menampilkan pesan pop-up sederhana.&lt;/p&gt;
&lt;hr data-end=&quot;2321&quot; data-start=&quot;2318&quot; /&gt;
&lt;h2 data-end=&quot;2353&quot; data-start=&quot;2323&quot;&gt;🪟 4. Membuat Custom Dialog&lt;/h2&gt;
&lt;p data-end=&quot;2452&quot; data-start=&quot;2355&quot;&gt;Kita bisa menampilkan jendela kecil dengan HTML sederhana untuk pengalaman yang lebih interaktif.&lt;/p&gt;
&lt;p data-end=&quot;2540&quot; data-start=&quot;2454&quot;&gt;Buat file baru di editor script: &lt;strong data-end=&quot;2540&quot; data-start=&quot;2487&quot;&gt;File → New → HTML file → beri nama &lt;code data-end=&quot;2538&quot; data-start=&quot;2524&quot;&gt;tentang.html&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p data-end=&quot;2566&quot; data-start=&quot;2542&quot;&gt;Isi dengan HTML berikut:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2914&quot; data-start=&quot;2568&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-meta&quot;&gt;&amp;lt;!DOCTYPE &lt;span class=&quot;hljs-keyword&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;head&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;base&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;target&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;_top&quot;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;head&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;style&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;font-family: Arial, sans-serif;&quot;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;h3&lt;/span&gt;&lt;/span&gt;&amp;gt;🧩 Otomasi Kita&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;h3&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;Add-on ini membantu kita mengotomatisasi tugas di Google Workspace.&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;b&lt;/span&gt;&lt;/span&gt;&amp;gt;Versi:&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;b&lt;/span&gt;&lt;/span&gt;&amp;gt; 1.0&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;google.script.host.close()&quot;&lt;/span&gt;&amp;gt;Tutup&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;
  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;html&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjYMiNad_OF9XRtO5HBFZPo5SOIdnWjbUO713Wj_ZO-l43HnDQscFUauqAGnva44JIvP0adhRnjTcyCQUwZZ73Vv6rGTBptA96YGgB2SHd9odX8WknxT5c2-afTLtSbJSPQqD2dKa7W241qWBRrZpl86NWee0FXSLZI68HOvg14QFM1_s0iifNXib258NIP&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 7: Membuat Add-on Sederhana untuk Google Sheets 1&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1366&quot; height=&quot;338&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjYMiNad_OF9XRtO5HBFZPo5SOIdnWjbUO713Wj_ZO-l43HnDQscFUauqAGnva44JIvP0adhRnjTcyCQUwZZ73Vv6rGTBptA96YGgB2SHd9odX8WknxT5c2-afTLtSbJSPQqD2dKa7W241qWBRrZpl86NWee0FXSLZI68HOvg14QFM1_s0iifNXib258NIP=w640-h338&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2955&quot; data-start=&quot;2916&quot;&gt;Lalu tampilkan dialog ini lewat fungsi:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3179&quot; data-start=&quot;2957&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tampilkanTentang&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; html = &lt;span class=&quot;hljs-title class_&quot;&gt;HtmlService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createHtmlOutputFromFile&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;tentang&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;setWidth&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;350&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;setHeight&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;);
  &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getUi&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;showModalDialog&lt;/span&gt;(html, &lt;span class=&quot;hljs-string&quot;&gt;&#39;Tentang Add-on Ini&#39;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi1HFRbiCyfEUXXtjbU_Rd69LsWS_cAsxsSG0WvBL20MVh3Grs2QzU2rp6rLUeoTPlbGCzB_CT9Ypc0si_lULEqrIBGdlNTF91DcXL1skQ78wWpbezREjDpt61lsm49IF7JqywbHfkyVEywmu4prAyFtWxW2mbEYhkkb-eWp22PjSU0xsSaihUR3JD76y1-&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 7: Membuat Add-on Sederhana untuk Google Sheets 2&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1366&quot; height=&quot;338&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi1HFRbiCyfEUXXtjbU_Rd69LsWS_cAsxsSG0WvBL20MVh3Grs2QzU2rp6rLUeoTPlbGCzB_CT9Ypc0si_lULEqrIBGdlNTF91DcXL1skQ78wWpbezREjDpt61lsm49IF7JqywbHfkyVEywmu4prAyFtWxW2mbEYhkkb-eWp22PjSU0xsSaihUR3JD76y1-=w640-h338&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;p data-end=&quot;3286&quot; data-start=&quot;3181&quot; style=&quot;text-align: left;&quot;&gt;✨ Kini saat kita klik menu “Tentang Add-on Ini”, dialog cantik akan muncul langsung di dalam spreadsheet.&lt;/p&gt;&lt;p data-end=&quot;3286&quot; data-start=&quot;3181&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj0rSxgAP1JoEKZlhStGR1UojKlv_Z6HVMFcSXBeFBe9A0sNCQP6YEdrLTe_wxWA5tKSJ8vh3V-AQoWvMYpXYmwBOACSmk0Ih_5uItM2Y2x_30mvrh9N8N-k0Ri92-coxHGDiAlNP8f8WuprGMrkqfZ0H-Wq_ek7mg_CIx5Exc-8IXAbkvkLFtqCYlBdAYX&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 7: Membuat Add-on Sederhana untuk Google Sheets 3&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1366&quot; height=&quot;338&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj0rSxgAP1JoEKZlhStGR1UojKlv_Z6HVMFcSXBeFBe9A0sNCQP6YEdrLTe_wxWA5tKSJ8vh3V-AQoWvMYpXYmwBOACSmk0Ih_5uItM2Y2x_30mvrh9N8N-k0Ri92-coxHGDiAlNP8f8WuprGMrkqfZ0H-Wq_ek7mg_CIx5Exc-8IXAbkvkLFtqCYlBdAYX=w640-h338&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 data-end=&quot;3332&quot; data-start=&quot;3293&quot;&gt;🧠 5. Membuat Sidebar (Lebih Lanjut)&lt;/h2&gt;
&lt;p data-end=&quot;3405&quot; data-start=&quot;3334&quot;&gt;Kalau ingin tampilan lebih besar di sisi kanan, kita bisa buat sidebar:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3594&quot; data-start=&quot;3407&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tampilkanSidebar&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; html = &lt;span class=&quot;hljs-title class_&quot;&gt;HtmlService&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createHtmlOutputFromFile&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;tentang&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;setTitle&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Otomasi Kita&#39;&lt;/span&gt;);
  &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getUi&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;showSidebar&lt;/span&gt;(html);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3629&quot; data-start=&quot;3596&quot;&gt;Sidebar ini bisa digunakan untuk:&lt;/p&gt;
&lt;ul data-end=&quot;3720&quot; data-start=&quot;3630&quot;&gt;
&lt;li data-end=&quot;3675&quot; data-start=&quot;3630&quot;&gt;
&lt;p data-end=&quot;3675&quot; data-start=&quot;3632&quot;&gt;Form input (misal: nama, email, tanggal).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3694&quot; data-start=&quot;3676&quot;&gt;
&lt;p data-end=&quot;3694&quot; data-start=&quot;3678&quot;&gt;Log aktivitas.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3720&quot; data-start=&quot;3695&quot;&gt;
&lt;p data-end=&quot;3720&quot; data-start=&quot;3697&quot;&gt;Pengaturan add-on kita.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj4-FXFPozZbUv9D3lo2Aepk6TjCrgY6xGfvv3sgYpEhIIyzrBW1UFZbh8D0DfgLcGLvzizRps1kFHpyo631MhX2JT3IvllTUdSUjz6in5bQKUqGnkzzTkyJ7Lmf15qjsaRNeYlErnIUztApKm_U90RrAF_YgdenHfMCdaNvhiAp5K0-Fc960LMeREMpD7e&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 7: Membuat Add-on Sederhana untuk Google Sheets 4&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1366&quot; height=&quot;338&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj4-FXFPozZbUv9D3lo2Aepk6TjCrgY6xGfvv3sgYpEhIIyzrBW1UFZbh8D0DfgLcGLvzizRps1kFHpyo631MhX2JT3IvllTUdSUjz6in5bQKUqGnkzzTkyJ7Lmf15qjsaRNeYlErnIUztApKm_U90RrAF_YgdenHfMCdaNvhiAp5K0-Fc960LMeREMpD7e=w640-h338&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr data-end=&quot;3725&quot; data-start=&quot;3722&quot; /&gt;
&lt;h2 data-end=&quot;3771&quot; data-start=&quot;3727&quot;&gt;🪄 6. Tips: Menghubungkan HTML dan Script&lt;/h2&gt;
&lt;p data-end=&quot;3825&quot; data-start=&quot;3773&quot;&gt;Kita bisa kirim data dari HTML ke Script (dua arah):&lt;/p&gt;
&lt;ul data-end=&quot;3932&quot; data-start=&quot;3826&quot;&gt;
&lt;li data-end=&quot;3880&quot; data-start=&quot;3826&quot;&gt;
&lt;p data-end=&quot;3880&quot; data-start=&quot;3828&quot;&gt;Dari HTML → Script: &lt;code data-end=&quot;3880&quot; data-start=&quot;3848&quot;&gt;google.script.run.namaFungsi()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3932&quot; data-start=&quot;3881&quot;&gt;
&lt;p data-end=&quot;3932&quot; data-start=&quot;3883&quot;&gt;Dari Script → HTML: &lt;code data-end=&quot;3916&quot; data-start=&quot;3903&quot;&gt;HtmlService&lt;/code&gt; dan &lt;code data-end=&quot;3931&quot; data-start=&quot;3921&quot;&gt;Template&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3941&quot; data-start=&quot;3934&quot;&gt;Contoh:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4031&quot; data-start=&quot;3942&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-html&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;google.script.run.kirimEmailOtomatis()&quot;&lt;/span&gt;&amp;gt;Kirim Email&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;button&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4127&quot; data-start=&quot;4033&quot;&gt;Jika fungsi &lt;code data-end=&quot;4067&quot; data-start=&quot;4045&quot;&gt;kirimEmailOtomatis()&lt;/code&gt; sudah ada di Script, tombol ini akan memanggilnya langsung!&lt;/p&gt;
&lt;hr data-end=&quot;4132&quot; data-start=&quot;4129&quot; /&gt;
&lt;h2 data-end=&quot;4186&quot; data-start=&quot;4134&quot;&gt;🧩 7. (Opsional) Men-deploy Sebagai Add-on Publik&lt;/h2&gt;
&lt;p data-end=&quot;4234&quot; data-start=&quot;4188&quot;&gt;Jika add-on ini ingin dibagikan ke orang lain:&lt;/p&gt;
&lt;ol data-end=&quot;4444&quot; data-start=&quot;4235&quot;&gt;
&lt;li data-end=&quot;4314&quot; data-start=&quot;4235&quot;&gt;
&lt;p data-end=&quot;4314&quot; data-start=&quot;4238&quot;&gt;Buka menu &lt;strong data-end=&quot;4311&quot; data-start=&quot;4248&quot;&gt;Deploy → Test deployments → Install add-on in this document&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4395&quot; data-start=&quot;4315&quot;&gt;
&lt;p data-end=&quot;4395&quot; data-start=&quot;4318&quot;&gt;Untuk publikasi ke Marketplace, pilih &lt;strong data-end=&quot;4392&quot; data-start=&quot;4356&quot;&gt;Deploy → New deployment → Add-on&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4444&quot; data-start=&quot;4396&quot;&gt;
&lt;p data-end=&quot;4444&quot; data-start=&quot;4399&quot;&gt;Lengkapi informasi deskripsi, logo, dan izin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;4574&quot; data-start=&quot;4446&quot;&gt;Namun, untuk penggunaan internal (misalnya di tim sendiri), cukup gunakan script ini di Spreadsheet dan bagikan akses editornya.&lt;/p&gt;
&lt;hr data-end=&quot;4579&quot; data-start=&quot;4576&quot; /&gt;
&lt;h2 data-end=&quot;4597&quot; data-start=&quot;4581&quot;&gt;📚 Kesimpulan&lt;/h2&gt;
&lt;p data-end=&quot;4630&quot; data-start=&quot;4599&quot;&gt;Di seri ini kita sudah belajar:&lt;/p&gt;
&lt;ul data-end=&quot;4803&quot; data-start=&quot;4631&quot;&gt;
&lt;li data-end=&quot;4672&quot; data-start=&quot;4631&quot;&gt;
&lt;p data-end=&quot;4672&quot; data-start=&quot;4633&quot;&gt;Membuat menu kustom di Google Sheets.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4706&quot; data-start=&quot;4673&quot;&gt;
&lt;p data-end=&quot;4706&quot; data-start=&quot;4675&quot;&gt;Menjalankan fungsi dari menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4747&quot; data-start=&quot;4707&quot;&gt;
&lt;p data-end=&quot;4747&quot; data-start=&quot;4709&quot;&gt;Menampilkan pop-up dan sidebar HTML.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4803&quot; data-start=&quot;4748&quot;&gt;
&lt;p data-end=&quot;4803&quot; data-start=&quot;4750&quot;&gt;(Opsional) Cara men-deploy add-on ke tim atau publik.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4941&quot; data-start=&quot;4805&quot;&gt;Dengan ini, script kita sudah naik level menjadi &lt;strong data-end=&quot;4904&quot; data-start=&quot;4854&quot;&gt;fitur tambahan langsung di dalam Google Sheets&lt;/strong&gt;, lengkap dengan UI dan menu sendiri.&lt;/p&gt;
&lt;hr data-end=&quot;4946&quot; data-start=&quot;4943&quot; /&gt;
&lt;h2 data-end=&quot;4970&quot; data-start=&quot;4948&quot;&gt;🔜 Seri Selanjutnya&lt;/h2&gt;
&lt;p data-end=&quot;5039&quot; data-start=&quot;4971&quot;&gt;➡️ &lt;strong data-end=&quot;5039&quot; data-start=&quot;4974&quot;&gt;Seri 8: Menghubungkan Google Apps Script dengan API Eksternal&lt;/strong&gt;&lt;/p&gt;
&lt;p data-end=&quot;5273&quot; data-start=&quot;5041&quot;&gt;Kita akan belajar bagaimana cara berkomunikasi dengan layanan luar (misalnya API cuaca, sistem internal, atau chatbot) menggunakan &lt;code data-end=&quot;5185&quot; data-start=&quot;5172&quot;&gt;UrlFetchApp&lt;/code&gt;.&lt;br data-end=&quot;5189&quot; data-start=&quot;5186&quot; /&gt;
Ini adalah langkah besar untuk membuat integrasi dan otomatisasi yang lebih canggih.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/234737489844765619/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-7-membuat-add-on-sederhana-untuk.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/234737489844765619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/234737489844765619'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-7-membuat-add-on-sederhana-untuk.html' title='Seri 7: Membuat Add-on Sederhana untuk Google Sheets'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjYMiNad_OF9XRtO5HBFZPo5SOIdnWjbUO713Wj_ZO-l43HnDQscFUauqAGnva44JIvP0adhRnjTcyCQUwZZ73Vv6rGTBptA96YGgB2SHd9odX8WknxT5c2-afTLtSbJSPQqD2dKa7W241qWBRrZpl86NWee0FXSLZI68HOvg14QFM1_s0iifNXib258NIP=s72-w640-h338-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-3948827551101365228</id><published>2025-10-26T15:44:00.003+07:00</published><updated>2025-10-27T04:46:17.347+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 6: Mengelola File dan Folder di Google Drive Secara Otomatis</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri sebelumnya, kita telah belajar&amp;nbsp;&lt;a href=&quot;/2025/10/seri-5-mengirim-email-otomatis-dengan.html&quot;&gt;mengirim email otomatis dengan template dinamis&lt;/a&gt;, pada&amp;nbsp; seri ini kita akan belajar:&lt;/p&gt;
&lt;ul data-end=&quot;689&quot; data-start=&quot;486&quot;&gt;
&lt;li data-end=&quot;536&quot; data-start=&quot;486&quot;&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;488&quot;&gt;Mengakses dan menelusuri file di Google Drive.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;588&quot; data-start=&quot;537&quot;&gt;
&lt;p data-end=&quot;588&quot; data-start=&quot;539&quot;&gt;Membuat, menyalin, dan memindahkan file/folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;629&quot; data-start=&quot;589&quot;&gt;
&lt;p data-end=&quot;629&quot; data-start=&quot;591&quot;&gt;Menghapus file lama secara otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;689&quot; data-start=&quot;630&quot;&gt;
&lt;p data-end=&quot;689&quot; data-start=&quot;632&quot;&gt;Menggabungkannya dengan trigger waktu untuk backup rutin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;694&quot; data-start=&quot;691&quot; /&gt;
&lt;h2 data-end=&quot;726&quot; data-start=&quot;696&quot;&gt;⚙️ 1. Pengenalan &lt;code data-end=&quot;726&quot; data-start=&quot;716&quot;&gt;DriveApp&lt;/code&gt;&lt;/h2&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;728&quot;&gt;Google Apps Script menyediakan layanan bernama &lt;strong data-end=&quot;789&quot; data-start=&quot;775&quot;&gt;&lt;code data-end=&quot;787&quot; data-start=&quot;777&quot;&gt;DriveApp&lt;/code&gt;&lt;/strong&gt; untuk berinteraksi dengan file dan folder di Google Drive.&lt;br data-end=&quot;851&quot; data-start=&quot;848&quot; /&gt;
Kita bisa menggunakannya untuk melakukan hampir semua hal yang bisa kita lakukan di antarmuka web Google Drive.&lt;/p&gt;
&lt;p data-end=&quot;988&quot; data-start=&quot;964&quot;&gt;Beberapa metode penting:&lt;/p&gt;
&lt;ul data-end=&quot;1230&quot; data-start=&quot;989&quot;&gt;
&lt;li data-end=&quot;1034&quot; data-start=&quot;989&quot;&gt;
&lt;p data-end=&quot;1034&quot; data-start=&quot;991&quot;&gt;&lt;code data-end=&quot;1012&quot; data-start=&quot;991&quot;&gt;DriveApp.getFiles()&lt;/code&gt; → Ambil semua file.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1098&quot; data-start=&quot;1035&quot;&gt;
&lt;p data-end=&quot;1098&quot; data-start=&quot;1037&quot;&gt;&lt;code data-end=&quot;1065&quot; data-start=&quot;1037&quot;&gt;DriveApp.getFolderById(id)&lt;/code&gt; → Akses folder berdasarkan ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1152&quot; data-start=&quot;1099&quot;&gt;
&lt;p data-end=&quot;1152&quot; data-start=&quot;1101&quot;&gt;&lt;code data-end=&quot;1130&quot; data-start=&quot;1101&quot;&gt;DriveApp.createFolder(nama)&lt;/code&gt; → Buat folder baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1188&quot; data-start=&quot;1153&quot;&gt;
&lt;p data-end=&quot;1188&quot; data-start=&quot;1155&quot;&gt;&lt;code data-end=&quot;1172&quot; data-start=&quot;1155&quot;&gt;file.makeCopy()&lt;/code&gt; → Salin file.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1230&quot; data-start=&quot;1189&quot;&gt;
&lt;p data-end=&quot;1230&quot; data-start=&quot;1191&quot;&gt;&lt;code data-end=&quot;1212&quot; data-start=&quot;1191&quot;&gt;file.moveTo(folder)&lt;/code&gt; → Pindahkan file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1235&quot; data-start=&quot;1232&quot; /&gt;
&lt;h2 data-end=&quot;1269&quot; data-start=&quot;1237&quot;&gt;📁 2. Membuat Folder Otomatis&lt;/h2&gt;
&lt;p data-end=&quot;1337&quot; data-start=&quot;1271&quot;&gt;Kita mulai dengan hal paling dasar — membuat folder baru di Drive:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1505&quot; data-start=&quot;1339&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;buatFolderBaru&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; folderBaru = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;createFolder&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Backup Mingguan&#39;&lt;/span&gt;);
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Folder dibuat: &#39;&lt;/span&gt; + folderBaru.&lt;span class=&quot;hljs-title function_&quot;&gt;getName&lt;/span&gt;());
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1588&quot; data-start=&quot;1507&quot;&gt;Setelah dijalankan, folder bernama &lt;em data-end=&quot;1561&quot; data-start=&quot;1542&quot;&gt;“Backup Mingguan”&lt;/em&gt; akan muncul di Drive kita.&lt;/p&gt;
&lt;hr data-end=&quot;1593&quot; data-start=&quot;1590&quot; /&gt;
&lt;h2 data-end=&quot;1637&quot; data-start=&quot;1595&quot;&gt;📂 3. Menemukan Folder Berdasarkan Nama&lt;/h2&gt;
&lt;p data-end=&quot;1685&quot; data-start=&quot;1639&quot;&gt;Jika kita ingin mencari folder yang sudah ada:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1971&quot; data-start=&quot;1687&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;cariFolder&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; folders = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getFoldersByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Backup Mingguan&#39;&lt;/span&gt;);
  &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (folders.&lt;span class=&quot;hljs-title function_&quot;&gt;hasNext&lt;/span&gt;()) {
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; folder = folders.&lt;span class=&quot;hljs-title function_&quot;&gt;next&lt;/span&gt;();
    &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Folder ditemukan: &#39;&lt;/span&gt; + folder.&lt;span class=&quot;hljs-title function_&quot;&gt;getName&lt;/span&gt;());
  } &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; {
    &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Folder tidak ditemukan.&#39;&lt;/span&gt;);
  }
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2140&quot; data-start=&quot;1973&quot;&gt;💡 &lt;code data-end=&quot;1996&quot; data-start=&quot;1976&quot;&gt;getFoldersByName()&lt;/code&gt; mengembalikan iterator — artinya bisa ada lebih dari satu folder dengan nama sama, jadi kita perlu &lt;code data-end=&quot;2107&quot; data-start=&quot;2096&quot;&gt;hasNext()&lt;/code&gt; dan &lt;code data-end=&quot;2120&quot; data-start=&quot;2112&quot;&gt;next()&lt;/code&gt; untuk mengambilnya.&lt;/p&gt;
&lt;hr data-end=&quot;2145&quot; data-start=&quot;2142&quot; /&gt;
&lt;h2 data-end=&quot;2184&quot; data-start=&quot;2147&quot;&gt;🧾 4. Menyalin File ke Folder Lain&lt;/h2&gt;
&lt;p data-end=&quot;2272&quot; data-start=&quot;2186&quot;&gt;Misalnya kita ingin menyalin file laporan dari folder utama ke folder backup otomatis.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2678&quot; data-start=&quot;2274&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;salinFileKeBackup&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; fileId = &lt;span class=&quot;hljs-string&quot;&gt;&#39;ID_FILE_ASLI&#39;&lt;/span&gt;; &lt;span class=&quot;hljs-comment&quot;&gt;// Ganti dengan ID file nyata&lt;/span&gt;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; folderBackup = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getFoldersByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Backup Mingguan&#39;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;next&lt;/span&gt;();
  
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; fileAsli = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getFileById&lt;/span&gt;(fileId);
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; fileSalinan = fileAsli.&lt;span class=&quot;hljs-title function_&quot;&gt;makeCopy&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`Backup - &lt;span class=&quot;hljs-subst&quot;&gt;${&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot;&gt;Date&lt;/span&gt;().toISOString()}`, folderBackup);
  
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`File berhasil disalin: &lt;span class=&quot;hljs-subst&quot;&gt;${fileSalinan.getName()}&lt;/span&gt;&lt;/span&gt;`);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2743&quot; data-start=&quot;2680&quot;&gt;👉 ID file bisa kita ambil dari URL Google Drive:&lt;br data-end=&quot;2732&quot; data-start=&quot;2729&quot; /&gt;
contohnya&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2834&quot; data-start=&quot;2744&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;https://drive.google.com/file/d/1abcXYZ123/view?usp=sharing  
→ ID-nya: 1abcXYZ123
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgfmNrmE7tduJoB4yEuTqMW0ARUnJ7WSe69Uu1dl8eJIfChQP9JBfU0FcOkFKWK6zGtBuDR-482ZrOXbxG1Id6xZ9IbwGoiMyK0kfr0_bYY9QtLnWZYAeh5ZWc8ZU1F8whYaFqZa3oHULV8DN6_9Se-Pbc_htPdTDhSpHR4GWm8XPPeHkEmEwShWAzpYD6M&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 6: Mengelola File dan Folder di Google Drive Secara Otomatis&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgfmNrmE7tduJoB4yEuTqMW0ARUnJ7WSe69Uu1dl8eJIfChQP9JBfU0FcOkFKWK6zGtBuDR-482ZrOXbxG1Id6xZ9IbwGoiMyK0kfr0_bYY9QtLnWZYAeh5ZWc8ZU1F8whYaFqZa3oHULV8DN6_9Se-Pbc_htPdTDhSpHR4GWm8XPPeHkEmEwShWAzpYD6M=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2839&quot; data-start=&quot;2836&quot; /&gt;
&lt;h2 data-end=&quot;2867&quot; data-start=&quot;2841&quot;&gt;🗃️ 5. Memindahkan File&lt;/h2&gt;
&lt;p data-end=&quot;2937&quot; data-start=&quot;2869&quot;&gt;Kita juga bisa &lt;strong data-end=&quot;2899&quot; data-start=&quot;2884&quot;&gt;memindahkan&lt;/strong&gt; file dari satu folder ke folder lain:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3195&quot; data-start=&quot;2939&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;pindahkanFile&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; file = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getFileById&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;ID_FILE_ASLI&#39;&lt;/span&gt;);
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; folderTujuan = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getFoldersByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Arsip&#39;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;next&lt;/span&gt;();
  
  file.&lt;span class=&quot;hljs-title function_&quot;&gt;moveTo&lt;/span&gt;(folderTujuan);
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;File berhasil dipindahkan ke folder Arsip&#39;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3282&quot; data-start=&quot;3197&quot;&gt;⚠️ Catatan:&lt;br data-end=&quot;3211&quot; data-start=&quot;3208&quot; /&gt;
File yang dipindahkan akan &lt;strong data-end=&quot;3265&quot; data-start=&quot;3238&quot;&gt;hilang dari folder asal&lt;/strong&gt; (bukan disalin).&lt;/p&gt;
&lt;hr data-end=&quot;3287&quot; data-start=&quot;3284&quot; /&gt;
&lt;h2 data-end=&quot;3326&quot; data-start=&quot;3289&quot;&gt;🧹 6. Menghapus File Lama Otomatis&lt;/h2&gt;
&lt;p data-end=&quot;3434&quot; data-start=&quot;3328&quot;&gt;Kita bisa membuat sistem pembersihan otomatis — misalnya menghapus file backup yang lebih tua dari 7 hari.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3947&quot; data-start=&quot;3436&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;hapusFileLama&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; folderBackup = &lt;span class=&quot;hljs-title class_&quot;&gt;DriveApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getFoldersByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Backup Mingguan&#39;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;next&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; files = folderBackup.&lt;span class=&quot;hljs-title function_&quot;&gt;getFiles&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; batasWaktu = &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;();
  batasWaktu.&lt;span class=&quot;hljs-title function_&quot;&gt;setDate&lt;/span&gt;(batasWaktu.&lt;span class=&quot;hljs-title function_&quot;&gt;getDate&lt;/span&gt;() - &lt;span class=&quot;hljs-number&quot;&gt;7&lt;/span&gt;);
  
  &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt; (files.&lt;span class=&quot;hljs-title function_&quot;&gt;hasNext&lt;/span&gt;()) {
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; file = files.&lt;span class=&quot;hljs-title function_&quot;&gt;next&lt;/span&gt;();
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; tanggalBuat = file.&lt;span class=&quot;hljs-title function_&quot;&gt;getDateCreated&lt;/span&gt;();
    &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (tanggalBuat &amp;lt; batasWaktu) {
      &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`Menghapus file lama: &lt;span class=&quot;hljs-subst&quot;&gt;${file.getName()}&lt;/span&gt;&lt;/span&gt;`);
      file.&lt;span class=&quot;hljs-title function_&quot;&gt;setTrashed&lt;/span&gt;(&lt;span class=&quot;hljs-literal&quot;&gt;true&lt;/span&gt;); &lt;span class=&quot;hljs-comment&quot;&gt;// Mengirim ke “Trash”&lt;/span&gt;
    }
  }
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4033&quot; data-start=&quot;3949&quot;&gt;Dengan begini, setiap minggu kita bisa bersihkan backup lama agar Drive tidak penuh.&lt;/p&gt;
&lt;hr data-end=&quot;4038&quot; data-start=&quot;4035&quot; /&gt;
&lt;h2 data-end=&quot;4084&quot; data-start=&quot;4040&quot;&gt;🕐 7. Otomasi Backup dengan Trigger Waktu&lt;/h2&gt;
&lt;p data-end=&quot;4183&quot; data-start=&quot;4086&quot;&gt;Kita bisa gabungkan semua logika di atas dengan trigger waktu agar berjalan otomatis tiap minggu.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4394&quot; data-start=&quot;4185&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;buatTriggerBackupMingguan&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;ScriptApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;newTrigger&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;salinFileKeBackup&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;timeBased&lt;/span&gt;()
    .&lt;span class=&quot;hljs-title function_&quot;&gt;everyWeeks&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;onWeekDay&lt;/span&gt;(&lt;span class=&quot;hljs-title class_&quot;&gt;ScriptApp&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;WeekDay&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;MONDAY&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;atHour&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;8&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;create&lt;/span&gt;();
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4500&quot; data-start=&quot;4396&quot;&gt;Dengan script ini, file kita akan otomatis dibackup ke folder “Backup Mingguan” setiap Senin pagi jam 8.&lt;/p&gt;
&lt;hr data-end=&quot;4505&quot; data-start=&quot;4502&quot; /&gt;
&lt;h2 data-end=&quot;4528&quot; data-start=&quot;4507&quot;&gt;🧠 8. Tips Praktis&lt;/h2&gt;
&lt;ul data-end=&quot;4799&quot; data-start=&quot;4529&quot;&gt;
&lt;li data-end=&quot;4627&quot; data-start=&quot;4529&quot;&gt;
&lt;p data-end=&quot;4627&quot; data-start=&quot;4531&quot;&gt;Gunakan &lt;code data-end=&quot;4553&quot; data-start=&quot;4539&quot;&gt;Logger.log()&lt;/code&gt; atau &lt;code data-end=&quot;4574&quot; data-start=&quot;4559&quot;&gt;console.log()&lt;/code&gt; (jika pakai V8 engine) untuk melihat hasil proses.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4728&quot; data-start=&quot;4628&quot;&gt;
&lt;p data-end=&quot;4728&quot; data-start=&quot;4630&quot;&gt;Jangan lupa periksa kuota Drive — script tidak akan bisa membuat salinan jika penyimpanan penuh.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4799&quot; data-start=&quot;4729&quot;&gt;
&lt;p data-end=&quot;4799&quot; data-start=&quot;4731&quot;&gt;Gunakan &lt;code data-end=&quot;4754&quot; data-start=&quot;4739&quot;&gt;file.getUrl()&lt;/code&gt; untuk mendapatkan link ke file hasil proses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4804&quot; data-start=&quot;4801&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Di seri ini kita sudah belajar:&lt;/p&gt;
&lt;ul data-end=&quot;5058&quot; data-start=&quot;4856&quot;&gt;
&lt;li data-end=&quot;4916&quot; data-start=&quot;4856&quot;&gt;
&lt;p data-end=&quot;4916&quot; data-start=&quot;4858&quot;&gt;Menggunakan &lt;code data-end=&quot;4880&quot; data-start=&quot;4870&quot;&gt;DriveApp&lt;/code&gt; untuk membuat dan mencari folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4964&quot; data-start=&quot;4917&quot;&gt;
&lt;p data-end=&quot;4964&quot; data-start=&quot;4919&quot;&gt;Menyalin dan memindahkan file antar folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5005&quot; data-start=&quot;4965&quot;&gt;
&lt;p data-end=&quot;5005&quot; data-start=&quot;4967&quot;&gt;Menghapus file lama secara otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5058&quot; data-start=&quot;5006&quot;&gt;
&lt;p data-end=&quot;5058&quot; data-start=&quot;5008&quot;&gt;Menjadwalkan backup mingguan dengan trigger waktu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5191&quot; data-start=&quot;5060&quot;&gt;Dengan kemampuan ini, kita bisa membuat sistem &lt;strong data-end=&quot;5156&quot; data-start=&quot;5107&quot;&gt;backup, arsip, dan manajemen dokumen otomatis&lt;/strong&gt; yang sepenuhnya berjalan di cloud.&lt;/p&gt;
&lt;hr data-end=&quot;5196&quot; data-start=&quot;5193&quot; /&gt;
&lt;h2 data-end=&quot;5220&quot; data-start=&quot;5198&quot;&gt;🔜 Seri Selanjutnya&lt;/h2&gt;
&lt;p data-end=&quot;5280&quot; data-start=&quot;5221&quot;&gt;&lt;a href=&quot;/2025/10/seri-7-membuat-add-on-sederhana-untuk.html&quot;&gt;➡️ &lt;strong data-end=&quot;5280&quot; data-start=&quot;5224&quot;&gt;Seri 7: Membuat Add-on Sederhana untuk Google Sheets&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-end=&quot;5486&quot; data-start=&quot;5282&quot;&gt;Kita akan belajar bagaimana membuat &lt;strong data-end=&quot;5350&quot; data-start=&quot;5318&quot;&gt;menu khusus di Google Sheets&lt;/strong&gt;, lalu menambahkan tombol atau fungsi yang bisa dipakai langsung oleh pengguna — seolah kita membuat aplikasi mini di dalam Spreadsheet.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/3948827551101365228/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-6-mengelola-file-dan-folder-di.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/3948827551101365228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/3948827551101365228'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-6-mengelola-file-dan-folder-di.html' title='Seri 6: Mengelola File dan Folder di Google Drive Secara Otomatis'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgfmNrmE7tduJoB4yEuTqMW0ARUnJ7WSe69Uu1dl8eJIfChQP9JBfU0FcOkFKWK6zGtBuDR-482ZrOXbxG1Id6xZ9IbwGoiMyK0kfr0_bYY9QtLnWZYAeh5ZWc8ZU1F8whYaFqZa3oHULV8DN6_9Se-Pbc_htPdTDhSpHR4GWm8XPPeHkEmEwShWAzpYD6M=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-8171722843299188689</id><published>2025-10-24T05:58:00.004+07:00</published><updated>2025-10-26T15:45:54.165+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 5: Mengirim Email Otomatis dengan Template Dinamis</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri sebelumnya, kita telah mempelajari&amp;nbsp;&lt;a href=&quot;/2025/10/seri-4-trigger-dan-event-otomatis-di.html&quot;&gt;Trigger dan Event Otomatis di Google Apps Script&lt;/a&gt;, pada&amp;nbsp; seri ini kita akan belajar cara:&lt;/p&gt;
&lt;ul data-end=&quot;631&quot; data-start=&quot;419&quot;&gt;
&lt;li data-end=&quot;466&quot; data-start=&quot;419&quot;&gt;
&lt;p data-end=&quot;466&quot; data-start=&quot;421&quot;&gt;Mengambil data dari &lt;strong data-end=&quot;463&quot; data-start=&quot;441&quot;&gt;Google Spreadsheet&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;560&quot; data-start=&quot;467&quot;&gt;
&lt;p data-end=&quot;560&quot; data-start=&quot;469&quot;&gt;Membuat &lt;strong data-end=&quot;495&quot; data-start=&quot;477&quot;&gt;template email&lt;/strong&gt; dengan variabel dinamis (misalnya nama, tanggal, status, dll).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;631&quot; data-start=&quot;561&quot;&gt;
&lt;p data-end=&quot;631&quot; data-start=&quot;563&quot;&gt;Mengirim email otomatis ke setiap penerima menggunakan &lt;strong data-end=&quot;630&quot; data-start=&quot;618&quot;&gt;GmailApp&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;689&quot; data-start=&quot;633&quot;&gt;Dengan pendekatan ini, kita bisa membuat sistem seperti:&lt;/p&gt;
&lt;ul data-end=&quot;834&quot; data-start=&quot;690&quot;&gt;
&lt;li data-end=&quot;738&quot; data-start=&quot;690&quot;&gt;
&lt;p data-end=&quot;738&quot; data-start=&quot;692&quot;&gt;Pengiriman notifikasi otomatis ke pelanggan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;767&quot; data-start=&quot;739&quot;&gt;
&lt;p data-end=&quot;767&quot; data-start=&quot;741&quot;&gt;Reminder tugas mingguan.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;834&quot; data-start=&quot;768&quot;&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;770&quot;&gt;Atau laporan rutin ke tim — semuanya tanpa perlu dikirim manual.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;839&quot; data-start=&quot;836&quot; /&gt;
&lt;h2 data-end=&quot;870&quot; data-start=&quot;841&quot;&gt;📊 1. Struktur Spreadsheet&lt;/h2&gt;
&lt;p data-end=&quot;938&quot; data-start=&quot;872&quot;&gt;Sebagai contoh, kita buat Spreadsheet dengan struktur seperti ini:&lt;/p&gt;
&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;google-sheets-html-origin&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;border-collapse: collapse; border: none; font-family: Arial; font-size: 10pt; table-layout: fixed; width: 0px;&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;100&quot;&gt;&lt;/col&gt;&lt;col width=&quot;100&quot;&gt;&lt;/col&gt;&lt;col width=&quot;100&quot;&gt;&lt;/col&gt;&lt;col width=&quot;100&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; font-weight: bold; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;&quot;&gt;Nama&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; font-weight: bold; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;&quot;&gt;Email&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; font-weight: bold; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;&quot;&gt;Status&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; font-weight: bold; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;&quot;&gt;Tanggal Kirim&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;Umi&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;rumahbajuumi@gmail.com&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;Belum Dikirim&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;Rufaidah&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;rufaidahcantik2022@gmail.com&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); font-family: &amp;quot;Times New Roman&amp;quot;; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;Belum Dikirim&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/google-sheets-html-origin&gt;&lt;/div&gt;&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;google-sheets-html-origin&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiAPQRM88IDthCUp4K28LixSgvGfj01HiwpcJH_5OZ68eaxFJrZkpNMM_EzAyZ5eEUkL56i5JJvJrH3N6mFi6tPEaaZh2Qqnv_uFm5rTTHEUGTUwx6_iwaC3O9TJ2DH5Lf5ZVeC-goctzOhWzMGrdsG8_itZkzDkHJp4cXFbuCQK3BprAkyPBtVgqf94TQs&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 5: Mengirim Email Otomatis dengan Template Dinamis&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiAPQRM88IDthCUp4K28LixSgvGfj01HiwpcJH_5OZ68eaxFJrZkpNMM_EzAyZ5eEUkL56i5JJvJrH3N6mFi6tPEaaZh2Qqnv_uFm5rTTHEUGTUwx6_iwaC3O9TJ2DH5Lf5ZVeC-goctzOhWzMGrdsG8_itZkzDkHJp4cXFbuCQK3BprAkyPBtVgqf94TQs=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Simpan sheet dengan nama misalnya &lt;code data-end=&quot;1270&quot; data-start=&quot;1259&quot;&gt;DataEmail&lt;/code&gt;.&lt;/google-sheets-html-origin&gt;&lt;/div&gt;
&lt;hr data-end=&quot;1276&quot; data-start=&quot;1273&quot; /&gt;
&lt;h2 data-end=&quot;1301&quot; data-start=&quot;1278&quot;&gt;🧱 2. Template Email&lt;/h2&gt;
&lt;p data-end=&quot;1372&quot; data-start=&quot;1303&quot;&gt;Kita bisa menyiapkan template langsung di kode, misalnya seperti ini:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1585&quot; data-start=&quot;1374&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;hljs-variable constant_&quot;&gt;TEMPLATE_EMAIL&lt;/span&gt; = &lt;span class=&quot;hljs-string&quot;&gt;`
Halo {{nama}},

Kami ingin mengingatkan bahwa status Anda saat ini adalah: {{status}}.

Terima kasih atas perhatian dan kerja samanya.
Salam hangat,
Tim Otomasi Kita
`&lt;/span&gt;;
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1687&quot; data-start=&quot;1587&quot;&gt;Kita akan mengganti &lt;code data-end=&quot;1617&quot; data-start=&quot;1607&quot;&gt;{{nama}}&lt;/code&gt; dan &lt;code data-end=&quot;1634&quot; data-start=&quot;1622&quot;&gt;{{status}}&lt;/code&gt; dengan data dari spreadsheet menggunakan JavaScript.&lt;/p&gt;
&lt;hr data-end=&quot;1692&quot; data-start=&quot;1689&quot; /&gt;
&lt;h2 data-end=&quot;1732&quot; data-start=&quot;1694&quot;&gt;⚙️ 3. Membaca Data dari Spreadsheet&lt;/h2&gt;
&lt;p data-end=&quot;1826&quot; data-start=&quot;1734&quot;&gt;Sekarang kita buat fungsi untuk membaca data dari sheet dan mengirim emailnya satu per satu.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2758&quot; data-start=&quot;1828&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;kirimEmailOtomatis&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; ss = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = ss.&lt;span class=&quot;hljs-title function_&quot;&gt;getSheetByName&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;DataEmail&#39;&lt;/span&gt;);
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getDataRange&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getValues&lt;/span&gt;();
  
  &lt;span class=&quot;hljs-comment&quot;&gt;// Lewati baris pertama (header)&lt;/span&gt;
  &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot;&gt;let&lt;/span&gt; i = &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;; i &amp;lt; data.&lt;span class=&quot;hljs-property&quot;&gt;length&lt;/span&gt;; i++) {
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; [nama, email, status, tanggalKirim] = data[i];
    
    &lt;span class=&quot;hljs-comment&quot;&gt;// Hanya kirim jika belum dikirim&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (status === &lt;span class=&quot;hljs-string&quot;&gt;&quot;Belum Dikirim&quot;&lt;/span&gt; &amp;amp;&amp;amp; email) {
      
      &lt;span class=&quot;hljs-comment&quot;&gt;// Ganti placeholder dengan data nyata&lt;/span&gt;
      &lt;span class=&quot;hljs-keyword&quot;&gt;let&lt;/span&gt; isiEmail = &lt;span class=&quot;hljs-variable constant_&quot;&gt;TEMPLATE_EMAIL&lt;/span&gt;
        .&lt;span class=&quot;hljs-title function_&quot;&gt;replace&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;{{nama}}&#39;&lt;/span&gt;, nama)
        .&lt;span class=&quot;hljs-title function_&quot;&gt;replace&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;{{status}}&#39;&lt;/span&gt;, status);
      
      &lt;span class=&quot;hljs-comment&quot;&gt;// Kirim email&lt;/span&gt;
      &lt;span class=&quot;hljs-title class_&quot;&gt;GmailApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;sendEmail&lt;/span&gt;(email, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Notifikasi Status Anda&quot;&lt;/span&gt;, isiEmail);
      
      &lt;span class=&quot;hljs-comment&quot;&gt;// Update status dan tanggal kirim di sheet&lt;/span&gt;
      sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(i + &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;3&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Sudah Dikirim&#39;&lt;/span&gt;);
      sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(i + &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;4&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;());
      
      &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`Email terkirim ke &lt;span class=&quot;hljs-subst&quot;&gt;${nama}&lt;/span&gt;&lt;/span&gt; (&lt;span class=&quot;hljs-subst&quot;&gt;${email}&lt;/span&gt;)`);
    }
  }
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEggIqlFbpPsxsGOYOslvWN662NxfAqlEZLF29O--1PgecoctoqgWxwqoBwQ-Fj-vVJK0pAvWiqo3RSXmyq1xw_LuRlAgMUmQFK0ufuWYg5C5T0WnFL7rEyTqs44eXvQyw7pZvIeXjO-fcIPJ6F90BDGXafZ1AQRh66KyIpTPnc9vyeYflvVF5cFknL0usPv&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Seri 5: Mengirim Email Otomatis dengan Template Dinamis 2&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEggIqlFbpPsxsGOYOslvWN662NxfAqlEZLF29O--1PgecoctoqgWxwqoBwQ-Fj-vVJK0pAvWiqo3RSXmyq1xw_LuRlAgMUmQFK0ufuWYg5C5T0WnFL7rEyTqs44eXvQyw7pZvIeXjO-fcIPJ6F90BDGXafZ1AQRh66KyIpTPnc9vyeYflvVF5cFknL0usPv=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2763&quot; data-start=&quot;2760&quot; /&gt;
&lt;h2 data-end=&quot;2789&quot; data-start=&quot;2765&quot;&gt;🧠 4. Penjelasan Kode&lt;/h2&gt;
&lt;p data-end=&quot;2817&quot; data-start=&quot;2791&quot;&gt;Mari kita uraikan sedikit:&lt;/p&gt;
&lt;ul data-end=&quot;3236&quot; data-start=&quot;2819&quot;&gt;
&lt;li data-end=&quot;2890&quot; data-start=&quot;2819&quot;&gt;
&lt;p data-end=&quot;2890&quot; data-start=&quot;2821&quot;&gt;&lt;code data-end=&quot;2845&quot; data-start=&quot;2821&quot;&gt;getActiveSpreadsheet()&lt;/code&gt; → Mengambil spreadsheet yang sedang aktif.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2978&quot; data-start=&quot;2891&quot;&gt;
&lt;p data-end=&quot;2978&quot; data-start=&quot;2893&quot;&gt;&lt;code data-end=&quot;2921&quot; data-start=&quot;2893&quot;&gt;getDataRange().getValues()&lt;/code&gt; → Mengambil semua data dalam bentuk array dua dimensi.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3048&quot; data-start=&quot;2979&quot;&gt;
&lt;p data-end=&quot;3048&quot; data-start=&quot;2981&quot;&gt;&lt;code data-end=&quot;3020&quot; data-start=&quot;2981&quot;&gt;for (let i = 1; i &amp;lt; data.length; i++)&lt;/code&gt; → Melompati baris header.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3132&quot; data-start=&quot;3049&quot;&gt;
&lt;p data-end=&quot;3132&quot; data-start=&quot;3051&quot;&gt;&lt;code data-end=&quot;3073&quot; data-start=&quot;3051&quot;&gt;GmailApp.sendEmail()&lt;/code&gt; → Fungsi bawaan Google Apps Script untuk mengirim email.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3236&quot; data-start=&quot;3133&quot;&gt;
&lt;p data-end=&quot;3236&quot; data-start=&quot;3135&quot;&gt;&lt;code data-end=&quot;3164&quot; data-start=&quot;3135&quot;&gt;sheet.getRange().setValue()&lt;/code&gt; → Menulis ulang data ke spreadsheet (untuk menandai status pengiriman).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3303&quot; data-start=&quot;3238&quot;&gt;Dengan cara ini, setiap baris hanya akan dikirim &lt;strong data-end=&quot;3302&quot; data-start=&quot;3287&quot;&gt;sekali saja&lt;/strong&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;3308&quot; data-start=&quot;3305&quot; /&gt;
&lt;h2 data-end=&quot;3367&quot; data-start=&quot;3310&quot;&gt;💡 5. Menambahkan Fitur CC, Lampiran, atau Format HTML&lt;/h2&gt;
&lt;p data-end=&quot;3451&quot; data-start=&quot;3369&quot;&gt;Kalau kita ingin membuat email yang lebih cantik, kita bisa gunakan &lt;strong data-end=&quot;3450&quot; data-start=&quot;3437&quot;&gt;HTML body&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3851&quot; data-start=&quot;3453&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;kirimEmailHTML&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; htmlBody = &lt;span class=&quot;hljs-string&quot;&gt;`
  &amp;lt;p&amp;gt;Halo &amp;lt;b&amp;gt;{{nama}}&amp;lt;/b&amp;gt;,&amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;Status Anda saat ini: &amp;lt;b&amp;gt;{{status}}&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;Terima kasih,&amp;lt;br&amp;gt;Tim Otomasi Kita&amp;lt;/p&amp;gt;
  `&lt;/span&gt;;
  
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; isiEmail = htmlBody
    .&lt;span class=&quot;hljs-title function_&quot;&gt;replace&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;{{nama}}&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;Andi&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;replace&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;{{status}}&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;Aktif&#39;&lt;/span&gt;);
  
  &lt;span class=&quot;hljs-title class_&quot;&gt;GmailApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;sendEmail&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;andi@example.com&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;Contoh Email HTML&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;&#39;&lt;/span&gt;, {
    &lt;span class=&quot;hljs-attr&quot;&gt;htmlBody&lt;/span&gt;: isiEmail
  });
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3880&quot; data-start=&quot;3853&quot;&gt;Kita bisa juga menambahkan:&lt;/p&gt;
&lt;ul data-end=&quot;3997&quot; data-start=&quot;3881&quot;&gt;
&lt;li data-end=&quot;3932&quot; data-start=&quot;3881&quot;&gt;
&lt;p data-end=&quot;3932&quot; data-start=&quot;3883&quot;&gt;&lt;strong data-end=&quot;3895&quot; data-start=&quot;3883&quot;&gt;Lampiran&lt;/strong&gt; → dengan &lt;code data-end=&quot;3930&quot; data-start=&quot;3905&quot;&gt;attachments: [fileBlob]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3997&quot; data-start=&quot;3933&quot;&gt;
&lt;p data-end=&quot;3997&quot; data-start=&quot;3935&quot;&gt;&lt;strong data-end=&quot;3947&quot; data-start=&quot;3935&quot;&gt;CC / BCC&lt;/strong&gt; → dengan &lt;code data-end=&quot;3962&quot; data-start=&quot;3957&quot;&gt;cc:&lt;/code&gt; atau &lt;code data-end=&quot;3974&quot; data-start=&quot;3968&quot;&gt;bcc:&lt;/code&gt; di parameter opsional.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4002&quot; data-start=&quot;3999&quot; /&gt;
&lt;h2 data-end=&quot;4040&quot; data-start=&quot;4004&quot;&gt;🕐 6. Menjadwalkan Email Otomatis&lt;/h2&gt;
&lt;p data-end=&quot;4195&quot; data-start=&quot;4042&quot;&gt;Jika kita ingin fungsi &lt;code data-end=&quot;4087&quot; data-start=&quot;4065&quot;&gt;kirimEmailOtomatis()&lt;/code&gt; berjalan otomatis setiap hari, tinggal tambahkan &lt;strong data-end=&quot;4154&quot; data-start=&quot;4137&quot;&gt;Trigger waktu&lt;/strong&gt; seperti yang sudah kita bahas di Seri 4:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4362&quot; data-start=&quot;4197&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;buatTriggerEmailHarian&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;ScriptApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;newTrigger&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;kirimEmailOtomatis&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;timeBased&lt;/span&gt;()
    .&lt;span class=&quot;hljs-title function_&quot;&gt;everyDays&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;atHour&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;8&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;create&lt;/span&gt;();
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4471&quot; data-start=&quot;4364&quot;&gt;Setelah dijalankan sekali, GAS akan mengirim email otomatis setiap jam 8 pagi sesuai data terbaru di sheet.&lt;/p&gt;
&lt;hr data-end=&quot;4476&quot; data-start=&quot;4473&quot; /&gt;
&lt;h2 data-end=&quot;4499&quot; data-start=&quot;4478&quot;&gt;🧩 7. Tips Praktis&lt;/h2&gt;
&lt;ul data-end=&quot;4760&quot; data-start=&quot;4500&quot;&gt;
&lt;li data-end=&quot;4573&quot; data-start=&quot;4500&quot;&gt;
&lt;p data-end=&quot;4573&quot; data-start=&quot;4502&quot;&gt;Tambahkan &lt;code data-end=&quot;4525&quot; data-start=&quot;4512&quot;&gt;try...catch&lt;/code&gt; agar script tetap aman meski ada error email.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4641&quot; data-start=&quot;4574&quot;&gt;
&lt;p data-end=&quot;4641&quot; data-start=&quot;4576&quot;&gt;Gunakan &lt;code data-end=&quot;4598&quot; data-start=&quot;4584&quot;&gt;Logger.log()&lt;/code&gt; untuk memantau hasil di &lt;em data-end=&quot;4638&quot; data-start=&quot;4623&quot;&gt;Execution log&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4760&quot; data-start=&quot;4642&quot;&gt;
&lt;p data-end=&quot;4760&quot; data-start=&quot;4644&quot;&gt;Jika ingin mengirim ribuan email, perhatikan batas kuota Gmail (biasanya 100–150 email per hari untuk akun biasa).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4784&quot; data-start=&quot;4762&quot;&gt;Contoh error handling:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4928&quot; data-start=&quot;4786&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt; {
  &lt;span class=&quot;hljs-title class_&quot;&gt;GmailApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;sendEmail&lt;/span&gt;(email, subject, body);
} &lt;span class=&quot;hljs-keyword&quot;&gt;catch&lt;/span&gt; (err) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Gagal mengirim ke &quot;&lt;/span&gt; + email + &lt;span class=&quot;hljs-string&quot;&gt;&quot;: &quot;&lt;/span&gt; + err);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;4933&quot; data-start=&quot;4930&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri ini kita sudah belajar:&lt;/p&gt;
&lt;ul data-end=&quot;5176&quot; data-start=&quot;4985&quot;&gt;
&lt;li data-end=&quot;5039&quot; data-start=&quot;4985&quot;&gt;
&lt;p data-end=&quot;5039&quot; data-start=&quot;4987&quot;&gt;Membuat template email dengan placeholder dinamis.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5076&quot; data-start=&quot;5040&quot;&gt;
&lt;p data-end=&quot;5076&quot; data-start=&quot;5042&quot;&gt;Mengambil data dari Spreadsheet.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5128&quot; data-start=&quot;5077&quot;&gt;
&lt;p data-end=&quot;5128&quot; data-start=&quot;5079&quot;&gt;Mengirim email otomatis dan memperbarui status.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5176&quot; data-start=&quot;5129&quot;&gt;
&lt;p data-end=&quot;5176&quot; data-start=&quot;5131&quot;&gt;Menjadwalkan pengiriman dengan trigger waktu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5333&quot; data-start=&quot;5178&quot;&gt;Sekarang kita sudah bisa membuat sistem &lt;strong data-end=&quot;5247&quot; data-start=&quot;5218&quot;&gt;notifikasi email otomatis&lt;/strong&gt; tanpa perlu server atau aplikasi tambahan — hanya dengan kekuatan Google Apps Script.&lt;/p&gt;
&lt;hr data-end=&quot;5338&quot; data-start=&quot;5335&quot; /&gt;
&lt;h2 data-end=&quot;5362&quot; data-start=&quot;5340&quot;&gt;🔜 Seri Selanjutnya&lt;/h2&gt;
&lt;p data-end=&quot;5435&quot; data-start=&quot;5363&quot;&gt;&lt;a href=&quot;/2025/10/seri-6-mengelola-file-dan-folder-di.html&quot;&gt;➡️ &lt;strong data-end=&quot;5435&quot; data-start=&quot;5366&quot;&gt;Seri 6: Mengelola File dan Folder di Google Drive Secara Otomatis&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-end=&quot;5622&quot; data-start=&quot;5437&quot;&gt;Kita akan belajar bagaimana membuat, menyalin, memindahkan, dan menghapus file di Google Drive menggunakan script — sangat berguna untuk backup otomatis dan pengelolaan dokumen digital.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/8171722843299188689/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-5-mengirim-email-otomatis-dengan.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8171722843299188689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8171722843299188689'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-5-mengirim-email-otomatis-dengan.html' title='Seri 5: Mengirim Email Otomatis dengan Template Dinamis'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiAPQRM88IDthCUp4K28LixSgvGfj01HiwpcJH_5OZ68eaxFJrZkpNMM_EzAyZ5eEUkL56i5JJvJrH3N6mFi6tPEaaZh2Qqnv_uFm5rTTHEUGTUwx6_iwaC3O9TJ2DH5Lf5ZVeC-goctzOhWzMGrdsG8_itZkzDkHJp4cXFbuCQK3BprAkyPBtVgqf94TQs=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-7137812342666154220</id><published>2025-10-23T05:02:00.005+07:00</published><updated>2025-10-23T05:05:48.017+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 4: Trigger dan Event Otomatis di Google Apps Script</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;Setelah kita belajar &lt;a href=&quot;/2025/10/seri-3-mengotomasi-google-sheets.html&quot;&gt;mengotomasi Google sheets menggunakan script&lt;/a&gt;,&amp;nbsp; pada&amp;nbsp; seri ini, kita akan mempelajari bagaimana cara membuat &lt;strong data-end=&quot;414&quot; data-start=&quot;381&quot;&gt;script yang berjalan otomatis&lt;/strong&gt; menggunakan &lt;strong data-end=&quot;438&quot; data-start=&quot;427&quot;&gt;Trigger&lt;/strong&gt; di Google Apps Script (GAS). Kita juga akan mempraktikkan contoh nyata — misalnya mengirim email otomatis ketika spreadsheet diubah, atau menjalankan tugas rutin setiap jam.&lt;/p&gt;
&lt;hr data-end=&quot;619&quot; data-start=&quot;616&quot; /&gt;
&lt;h2 data-end=&quot;643&quot; data-start=&quot;621&quot;&gt;🔍 Apa Itu Trigger?&lt;/h2&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;645&quot;&gt;Trigger adalah &lt;strong data-end=&quot;670&quot; data-start=&quot;660&quot;&gt;pemicu&lt;/strong&gt; yang membuat fungsi tertentu berjalan secara otomatis berdasarkan &lt;strong data-end=&quot;746&quot; data-start=&quot;737&quot;&gt;event&lt;/strong&gt; tertentu.&lt;br data-end=&quot;759&quot; data-start=&quot;756&quot; /&gt;
Dengan trigger, kita tidak perlu klik tombol &lt;em data-end=&quot;809&quot; data-start=&quot;804&quot;&gt;Run&lt;/em&gt; setiap kali ingin menjalankan script.&lt;/p&gt;
&lt;p data-end=&quot;891&quot; data-start=&quot;849&quot;&gt;Secara umum, ada dua jenis trigger di GAS:&lt;/p&gt;
&lt;ol data-end=&quot;1201&quot; data-start=&quot;893&quot;&gt;
&lt;li data-end=&quot;1044&quot; data-start=&quot;893&quot;&gt;
&lt;p data-end=&quot;1044&quot; data-start=&quot;896&quot;&gt;&lt;strong data-end=&quot;934&quot; data-start=&quot;896&quot;&gt;Simple Trigger (Trigger Sederhana)&lt;/strong&gt;&lt;br data-end=&quot;937&quot; data-start=&quot;934&quot; /&gt;
Contoh: &lt;code data-end=&quot;958&quot; data-start=&quot;948&quot;&gt;onOpen()&lt;/code&gt;, &lt;code data-end=&quot;970&quot; data-start=&quot;960&quot;&gt;onEdit()&lt;/code&gt;, &lt;code data-end=&quot;985&quot; data-start=&quot;972&quot;&gt;onInstall()&lt;/code&gt;&lt;br data-end=&quot;988&quot; data-start=&quot;985&quot; /&gt;
→ Tidak perlu diset di menu mana pun, otomatis aktif.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1201&quot; data-start=&quot;1046&quot;&gt;
&lt;p data-end=&quot;1201&quot; data-start=&quot;1049&quot;&gt;&lt;strong data-end=&quot;1096&quot; data-start=&quot;1049&quot;&gt;Installable Trigger (Trigger yang Diinstal)&lt;/strong&gt;&lt;br data-end=&quot;1099&quot; data-start=&quot;1096&quot; /&gt;
→ Bisa diatur waktu, event, atau sumber dokumen tertentu.&lt;br data-end=&quot;1162&quot; data-start=&quot;1159&quot; /&gt;
→ Dibuat melalui editor atau script.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1206&quot; data-start=&quot;1203&quot; /&gt;
&lt;h2 data-end=&quot;1258&quot; data-start=&quot;1208&quot;&gt;⚙️ 1. Simple Trigger: &lt;code data-end=&quot;1243&quot; data-start=&quot;1233&quot;&gt;onOpen()&lt;/code&gt; dan &lt;code data-end=&quot;1258&quot; data-start=&quot;1248&quot;&gt;onEdit()&lt;/code&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1329&quot; data-start=&quot;1260&quot;&gt;Simple trigger dijalankan otomatis ketika peristiwa tertentu terjadi.&lt;/p&gt;
&lt;p data-end=&quot;1414&quot; data-start=&quot;1331&quot;&gt;Misalnya, kita ingin menampilkan pesan selamat datang saat file Spreadsheet dibuka.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1540&quot; data-start=&quot;1416&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onOpen&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getUi&lt;/span&gt;()
    .&lt;span class=&quot;hljs-title function_&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Selamat datang di spreadsheet otomatis kita!&#39;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEihocOrTKWOQkEMcEzgubd-Lr-IvZJRrw8w2F6NZx-ZaaODGi7BSsdeBQm9VWoTbdR_vL78mxLV98XLiJ7rPATnmglwxPJvP-4Qu1hCTlGOXSN3bGsu1J9Aqp7p6zQlTWx2kfgHjBYT9VB333GHQC9Y08O_3F1u55dkHi0EsrhQ-WTv5g3Eo7b0i9n31koy&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Trigger dan Event Otomatis di Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEihocOrTKWOQkEMcEzgubd-Lr-IvZJRrw8w2F6NZx-ZaaODGi7BSsdeBQm9VWoTbdR_vL78mxLV98XLiJ7rPATnmglwxPJvP-4Qu1hCTlGOXSN3bGsu1J9Aqp7p6zQlTWx2kfgHjBYT9VB333GHQC9Y08O_3F1u55dkHi0EsrhQ-WTv5g3Eo7b0i9n31koy=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiYPCkQAlkT7O6lBkIbYy-k3vfrjDvTqKpnCm0WqTnPIZFGkJbSUWCuFN3_UMz4W1bordikW_ePAkQqDn8TcTlxsddApjLomUEuFoEJZ8K7sLJxBnCTKbyvg6Rho5wgj8gRInakjbGw0XnUXcmQnXV0vEEjlVw8k6Mp8aghjfVv6oogOBevEvzWCaMUswKR&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Trigger dan Event Otomatis di Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiYPCkQAlkT7O6lBkIbYy-k3vfrjDvTqKpnCm0WqTnPIZFGkJbSUWCuFN3_UMz4W1bordikW_ePAkQqDn8TcTlxsddApjLomUEuFoEJZ8K7sLJxBnCTKbyvg6Rho5wgj8gRInakjbGw0XnUXcmQnXV0vEEjlVw8k6Mp8aghjfVv6oogOBevEvzWCaMUswKR=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1621&quot; data-start=&quot;1542&quot;&gt;💡 Fungsi ini &lt;strong data-end=&quot;1590&quot; data-start=&quot;1556&quot;&gt;harus bernama tepat &lt;code data-end=&quot;1588&quot; data-start=&quot;1578&quot;&gt;onOpen()&lt;/code&gt;&lt;/strong&gt;, tidak bisa diganti nama lain.&lt;/p&gt;
&lt;p data-end=&quot;1714&quot; data-start=&quot;1623&quot;&gt;Begitu juga dengan &lt;code data-end=&quot;1652&quot; data-start=&quot;1642&quot;&gt;onEdit()&lt;/code&gt;, yang akan otomatis berjalan setiap kali ada sel yang diubah:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1880&quot; data-start=&quot;1716&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onEdit&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; range = e.&lt;span class=&quot;hljs-property&quot;&gt;range&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; value = e.&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;;
  
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;`Sel &lt;span class=&quot;hljs-subst&quot;&gt;${range.getA1Notation()}&lt;/span&gt;&lt;/span&gt; diubah menjadi: &lt;span class=&quot;hljs-subst&quot;&gt;${value}&lt;/span&gt;`);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1905&quot; data-start=&quot;1882&quot;&gt;📘 &lt;strong data-end=&quot;1905&quot; data-start=&quot;1885&quot;&gt;Catatan penting:&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;2084&quot; data-start=&quot;1906&quot;&gt;
&lt;li data-end=&quot;2030&quot; data-start=&quot;1906&quot;&gt;
&lt;p data-end=&quot;2030&quot; data-start=&quot;1908&quot;&gt;Simple trigger &lt;strong data-end=&quot;1971&quot; data-start=&quot;1923&quot;&gt;tidak bisa mengakses layanan berhak istimewa&lt;/strong&gt; (seperti Gmail, Calendar, atau Drive dengan izin penuh).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2084&quot; data-start=&quot;2031&quot;&gt;
&lt;p data-end=&quot;2084&quot; data-start=&quot;2033&quot;&gt;Jika kita butuh itu, gunakan &lt;em data-end=&quot;2083&quot; data-start=&quot;2062&quot;&gt;Installable Trigger&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2089&quot; data-start=&quot;2086&quot; /&gt;
&lt;h2 data-end=&quot;2146&quot; data-start=&quot;2091&quot;&gt;🕐 2. Installable Trigger: Mengatur Waktu atau Event&lt;/h2&gt;
&lt;p data-end=&quot;2282&quot; data-start=&quot;2148&quot;&gt;Installable trigger bisa kita atur agar fungsi berjalan otomatis pada &lt;strong data-end=&quot;2245&quot; data-start=&quot;2218&quot;&gt;interval waktu tertentu&lt;/strong&gt;, atau ketika event spesifik terjadi.&lt;/p&gt;
&lt;h3 data-end=&quot;2329&quot; data-start=&quot;2284&quot;&gt;📅 Contoh: Menjalankan Script Setiap Hari&lt;/h3&gt;
&lt;p data-end=&quot;2397&quot; data-start=&quot;2331&quot;&gt;Misalnya kita ingin mengirim laporan otomatis setiap pagi pukul 7.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2591&quot; data-start=&quot;2399&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;kirimLaporanHarian&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;MailApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;sendEmail&lt;/span&gt;(
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;tim@perusahaan.com&quot;&lt;/span&gt;,
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;Laporan Harian&quot;&lt;/span&gt;,
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;Halo tim, ini laporan otomatis dari Google Apps Script kita.&quot;&lt;/span&gt;
  );
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2629&quot; data-start=&quot;2593&quot;&gt;Sekarang kita tambahkan trigger-nya:&lt;/p&gt;
&lt;ol data-end=&quot;2882&quot; data-start=&quot;2631&quot;&gt;
&lt;li data-end=&quot;2705&quot; data-start=&quot;2631&quot;&gt;
&lt;p data-end=&quot;2705&quot; data-start=&quot;2634&quot;&gt;Buka menu &lt;strong data-end=&quot;2656&quot; data-start=&quot;2644&quot;&gt;Triggers&lt;/strong&gt; di Apps Script (&lt;code data-end=&quot;2685&quot; data-start=&quot;2673&quot;&gt;Ikon jam ⏰&lt;/code&gt; di toolbar kiri).&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjGe6ZDeXdrLmSn2-7fbfySszc6_1mp8UOLZD6kRzB3o9VTB40qiTBVTpzXC49Seii7LnaDIjxiBcblMko1H8VSKm8a5WsExv9cHqUxKJWzwdA5TvhqoiGxVQ0PZyhjTH9vc9cKFjnNx402unCNCbkkqnvyEjLdaVcFNTmOdEu6TfjrvnxXL3XtUbUbu_wL&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Trigger dan Event Otomatis di Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjGe6ZDeXdrLmSn2-7fbfySszc6_1mp8UOLZD6kRzB3o9VTB40qiTBVTpzXC49Seii7LnaDIjxiBcblMko1H8VSKm8a5WsExv9cHqUxKJWzwdA5TvhqoiGxVQ0PZyhjTH9vc9cKFjnNx402unCNCbkkqnvyEjLdaVcFNTmOdEu6TfjrvnxXL3XtUbUbu_wL=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li data-end=&quot;2734&quot; data-start=&quot;2706&quot;&gt;
&lt;p data-end=&quot;2734&quot; data-start=&quot;2709&quot;&gt;Klik &lt;strong data-end=&quot;2731&quot; data-start=&quot;2714&quot;&gt;+ Add Trigger&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2774&quot; data-start=&quot;2735&quot;&gt;
&lt;p data-end=&quot;2774&quot; data-start=&quot;2738&quot;&gt;Pilih fungsi &lt;code data-end=&quot;2771&quot; data-start=&quot;2751&quot;&gt;kirimLaporanHarian&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2814&quot; data-start=&quot;2775&quot;&gt;
&lt;p data-end=&quot;2814&quot; data-start=&quot;2778&quot;&gt;Pilih event type: &lt;strong data-end=&quot;2811&quot; data-start=&quot;2796&quot;&gt;Time-driven&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2864&quot; data-start=&quot;2815&quot;&gt;
&lt;p data-end=&quot;2864&quot; data-start=&quot;2818&quot;&gt;Atur agar berjalan &lt;strong data-end=&quot;2861&quot; data-start=&quot;2837&quot;&gt;Setiap hari – 7 pagi&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2882&quot; data-start=&quot;2865&quot;&gt;
&lt;p data-end=&quot;2882&quot; data-start=&quot;2868&quot;&gt;Klik &lt;strong data-end=&quot;2881&quot; data-start=&quot;2873&quot;&gt;Save&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2962&quot; data-start=&quot;2884&quot;&gt;Setelah itu, GAS akan menjalankan fungsi ini otomatis setiap hari pukul 07.00!&lt;/p&gt;
&lt;hr data-end=&quot;2967&quot; data-start=&quot;2964&quot; /&gt;
&lt;h2 data-end=&quot;3011&quot; data-start=&quot;2969&quot;&gt;✨ 3. Trigger Berbasis Event Spreadsheet&lt;/h2&gt;
&lt;p data-end=&quot;3101&quot; data-start=&quot;3013&quot;&gt;Kita juga bisa membuat trigger yang berjalan &lt;strong data-end=&quot;3100&quot; data-start=&quot;3058&quot;&gt;saat Spreadsheet diubah oleh siapa pun&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;3201&quot; data-start=&quot;3103&quot;&gt;Misalnya kita ingin otomatis menandai baris sebagai “Sudah Diperbarui” saat kolom tertentu diubah:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3442&quot; data-start=&quot;3203&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onEdit&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = e.&lt;span class=&quot;hljs-property&quot;&gt;source&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; range = e.&lt;span class=&quot;hljs-property&quot;&gt;range&lt;/span&gt;;
  
  &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (range.&lt;span class=&quot;hljs-title function_&quot;&gt;getColumn&lt;/span&gt;() === &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;) { &lt;span class=&quot;hljs-comment&quot;&gt;// Jika kolom B diubah&lt;/span&gt;
    sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(range.&lt;span class=&quot;hljs-title function_&quot;&gt;getRow&lt;/span&gt;(), &lt;span class=&quot;hljs-number&quot;&gt;3&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Sudah Diperbarui&#39;&lt;/span&gt;);
  }
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3592&quot; data-start=&quot;3444&quot;&gt;Setiap kali kolom B berubah, kolom C akan otomatis terisi teks &quot;Sudah Diperbarui&quot;.&lt;br data-end=&quot;3529&quot; data-start=&quot;3526&quot; /&gt;
Sederhana tapi sangat berguna untuk otomatisasi pelacakan data.&lt;/p&gt;
&lt;hr data-end=&quot;3597&quot; data-start=&quot;3594&quot; /&gt;
&lt;h2 data-end=&quot;3638&quot; data-start=&quot;3599&quot;&gt;🚀 4. Membuat Trigger Melalui Script&lt;/h2&gt;
&lt;p data-end=&quot;3727&quot; data-start=&quot;3640&quot;&gt;Kita juga bisa membuat &lt;em data-end=&quot;3684&quot; data-start=&quot;3663&quot;&gt;installable trigger&lt;/em&gt; langsung lewat kode, bukan manual dari UI.&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3891&quot; data-start=&quot;3729&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;buatTriggerOtomatis&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;ScriptApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;newTrigger&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;kirimLaporanHarian&#39;&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;timeBased&lt;/span&gt;()
    .&lt;span class=&quot;hljs-title function_&quot;&gt;everyDays&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;atHour&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;7&lt;/span&gt;)
    .&lt;span class=&quot;hljs-title function_&quot;&gt;create&lt;/span&gt;();
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4010&quot; data-start=&quot;3893&quot;&gt;💡 Jalankan &lt;code data-end=&quot;3928&quot; data-start=&quot;3905&quot;&gt;buatTriggerOtomatis()&lt;/code&gt; &lt;strong data-end=&quot;3944&quot; data-start=&quot;3929&quot;&gt;sekali saja&lt;/strong&gt;, dan Google akan menjadwalkan trigger otomatis harian untuk kita.&lt;/p&gt;
&lt;hr data-end=&quot;4015&quot; data-start=&quot;4012&quot; /&gt;
&lt;h2 data-end=&quot;4035&quot; data-start=&quot;4017&quot;&gt;🧠 Tips Praktis&lt;/h2&gt;
&lt;ul data-end=&quot;4297&quot; data-start=&quot;4036&quot;&gt;
&lt;li data-end=&quot;4115&quot; data-start=&quot;4036&quot;&gt;
&lt;p data-end=&quot;4115&quot; data-start=&quot;4038&quot;&gt;Gunakan &lt;code data-end=&quot;4060&quot; data-start=&quot;4046&quot;&gt;Logger.log()&lt;/code&gt; untuk debugging fungsi yang dijalankan oleh trigger.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4212&quot; data-start=&quot;4116&quot;&gt;
&lt;p data-end=&quot;4212&quot; data-start=&quot;4118&quot;&gt;Untuk fungsi &lt;code data-end=&quot;4142&quot; data-start=&quot;4131&quot;&gt;onEdit(e)&lt;/code&gt;, parameter &lt;code data-end=&quot;4157&quot; data-start=&quot;4154&quot;&gt;e&lt;/code&gt; menyimpan info seperti &lt;code data-end=&quot;4188&quot; data-start=&quot;4181&quot;&gt;range&lt;/code&gt;, &lt;code data-end=&quot;4197&quot; data-start=&quot;4190&quot;&gt;value&lt;/code&gt;, dan &lt;code data-end=&quot;4209&quot; data-start=&quot;4203&quot;&gt;user&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4297&quot; data-start=&quot;4213&quot;&gt;
&lt;p data-end=&quot;4297&quot; data-start=&quot;4215&quot;&gt;Gunakan &lt;code data-end=&quot;4236&quot; data-start=&quot;4223&quot;&gt;try...catch&lt;/code&gt; untuk menangani error agar script tidak berhenti mendadak.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4306&quot; data-start=&quot;4299&quot;&gt;Contoh:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4492&quot; data-start=&quot;4308&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onEdit&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt; {
    &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; value = e.&lt;span class=&quot;hljs-property&quot;&gt;value&lt;/span&gt;;
    &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Nilai baru:&#39;&lt;/span&gt;, value);
  } &lt;span class=&quot;hljs-keyword&quot;&gt;catch&lt;/span&gt; (error) {
    &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Terjadi kesalahan: &#39;&lt;/span&gt; + error);
  }
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;4497&quot; data-start=&quot;4494&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri ini kita telah belajar:&lt;/p&gt;
&lt;ul data-end=&quot;4719&quot; data-start=&quot;4549&quot;&gt;
&lt;li data-end=&quot;4588&quot; data-start=&quot;4549&quot;&gt;
&lt;p data-end=&quot;4588&quot; data-start=&quot;4551&quot;&gt;Apa itu trigger dan jenis-jenisnya.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4632&quot; data-start=&quot;4589&quot;&gt;
&lt;p data-end=&quot;4632&quot; data-start=&quot;4591&quot;&gt;Cara membuat &lt;code data-end=&quot;4614&quot; data-start=&quot;4604&quot;&gt;onOpen()&lt;/code&gt; dan &lt;code data-end=&quot;4629&quot; data-start=&quot;4619&quot;&gt;onEdit()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4678&quot; data-start=&quot;4633&quot;&gt;
&lt;p data-end=&quot;4678&quot; data-start=&quot;4635&quot;&gt;Cara menjadwalkan fungsi otomatis harian.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4719&quot; data-start=&quot;4679&quot;&gt;
&lt;p data-end=&quot;4719&quot; data-start=&quot;4681&quot;&gt;Dan cara membuat trigger lewat script.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4897&quot; data-start=&quot;4721&quot;&gt;Dengan trigger, kita bisa membuat &lt;strong data-end=&quot;4796&quot; data-start=&quot;4755&quot;&gt;Spreadsheet atau Dokumen yang “hidup”&lt;/strong&gt;, bereaksi otomatis tanpa kita jalankan manual — inilah salah satu kekuatan utama Google Apps Script.&lt;/p&gt;
&lt;hr data-end=&quot;4902&quot; data-start=&quot;4899&quot; /&gt;
&lt;h2 data-end=&quot;4926&quot; data-start=&quot;4904&quot;&gt;🔜 Seri Selanjutnya&lt;/h2&gt;
&lt;p data-end=&quot;4989&quot; data-start=&quot;4927&quot;&gt;➡️ &lt;strong data-end=&quot;4989&quot; data-start=&quot;4930&quot;&gt;Seri 5: Mengirim Email Otomatis dengan Template Dinamis&lt;/strong&gt;&lt;/p&gt;
&lt;p data-end=&quot;5123&quot; data-start=&quot;4991&quot;&gt;Kita akan belajar membuat sistem pengiriman email otomatis menggunakan GmailApp, lengkap dengan variabel dinamis dari Spreadsheet.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/7137812342666154220/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-4-trigger-dan-event-otomatis-di.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/7137812342666154220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/7137812342666154220'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-4-trigger-dan-event-otomatis-di.html' title='Seri 4: Trigger dan Event Otomatis di Google Apps Script'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEihocOrTKWOQkEMcEzgubd-Lr-IvZJRrw8w2F6NZx-ZaaODGi7BSsdeBQm9VWoTbdR_vL78mxLV98XLiJ7rPATnmglwxPJvP-4Qu1hCTlGOXSN3bGsu1J9Aqp7p6zQlTWx2kfgHjBYT9VB333GHQC9Y08O_3F1u55dkHi0EsrhQ-WTv5g3Eo7b0i9n31koy=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-5528348077574277388</id><published>2025-10-22T05:35:00.002+07:00</published><updated>2025-10-23T05:04:24.822+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 3: Mengotomasi Google Sheets Menggunakan Script</title><content type='html'>&lt;h3 data-end=&quot;357&quot; data-start=&quot;299&quot;&gt;&lt;em data-end=&quot;357&quot; data-start=&quot;303&quot;&gt;Membaca, Menulis, dan Memformat Data Secara Otomatis&lt;/em&gt;&lt;/h3&gt;
&lt;hr data-end=&quot;362&quot; data-start=&quot;359&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Di dua seri sebelumnya, kita sudah mengenal &lt;a href=&quot;/2025/10/seri-1-pengenalan-google-apps-script.html&quot;&gt;dasar Google Apps Script (GAS)&lt;/a&gt; dan &lt;a href=&quot;/2025/10/seri-2-dasar-pemrograman-di-google-apps.html&quot;&gt;belajar menulis serta menjalankan fungsi sederhana&lt;/a&gt;.&lt;/p&gt;&lt;p data-end=&quot;628&quot; data-start=&quot;382&quot;&gt;
Sekarang saatnya kita melangkah lebih jauh — &lt;strong data-end=&quot;628&quot; data-start=&quot;560&quot;&gt;menghubungkan Apps Script langsung dengan data di Google Sheets.&lt;/strong&gt;&lt;/p&gt;
&lt;p data-end=&quot;666&quot; data-start=&quot;630&quot;&gt;Melalui seri ini, kita akan belajar:&lt;/p&gt;
&lt;ul data-end=&quot;881&quot; data-start=&quot;667&quot;&gt;
&lt;li data-end=&quot;715&quot; data-start=&quot;667&quot;&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;669&quot;&gt;Membaca dan menulis data di sel spreadsheet,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;754&quot; data-start=&quot;716&quot;&gt;
&lt;p data-end=&quot;754&quot; data-start=&quot;718&quot;&gt;Menambahkan baris secara otomatis,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;755&quot;&gt;
&lt;p data-end=&quot;789&quot; data-start=&quot;757&quot;&gt;Membuat format tabel otomatis,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;881&quot; data-start=&quot;790&quot;&gt;
&lt;p data-end=&quot;881&quot; data-start=&quot;792&quot;&gt;Serta membuat fungsi &lt;em data-end=&quot;829&quot; data-start=&quot;813&quot;&gt;auto timestamp&lt;/em&gt; agar setiap perubahan data bisa terekam otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1000&quot; data-start=&quot;883&quot;&gt;Dengan memahami ini, kita sudah bisa mengotomatiskan banyak pekerjaan administratif hanya dengan beberapa baris kode.&lt;/p&gt;
&lt;hr data-end=&quot;1005&quot; data-start=&quot;1002&quot; /&gt;
&lt;h3 data-end=&quot;1056&quot; data-start=&quot;1007&quot;&gt;⚙️ 1. Mengenal Objek SpreadsheetApp dan Sheet&lt;/h3&gt;
&lt;p data-end=&quot;1160&quot; data-start=&quot;1058&quot;&gt;Untuk berinteraksi dengan Google Sheets, Apps Script menyediakan objek utama bernama &lt;code data-end=&quot;1159&quot; data-start=&quot;1143&quot;&gt;SpreadsheetApp&lt;/code&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1271&quot; data-start=&quot;1162&quot;&gt;Dari objek ini, kita bisa mengakses dokumen yang sedang aktif, lalu memilih lembar kerja (sheet) di dalamnya.&lt;/p&gt;
&lt;p data-end=&quot;1286&quot; data-start=&quot;1273&quot;&gt;Contoh dasar:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1479&quot; data-start=&quot;1288&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;contohSpreadsheetApp&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; spreadsheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = spreadsheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getName&lt;/span&gt;());
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1639&quot; data-start=&quot;1481&quot;&gt;Kode di atas akan menampilkan nama sheet aktif di log.&lt;br data-end=&quot;1538&quot; data-start=&quot;1535&quot; /&gt;
&lt;code data-end=&quot;1554&quot; data-start=&quot;1538&quot;&gt;SpreadsheetApp&lt;/code&gt; adalah pintu utama, dan &lt;code data-end=&quot;1586&quot; data-start=&quot;1579&quot;&gt;sheet&lt;/code&gt; adalah halaman tempat kita berinteraksi dengan data.&lt;/p&gt;
&lt;hr data-end=&quot;1644&quot; data-start=&quot;1641&quot; /&gt;
&lt;h3 data-end=&quot;1687&quot; data-start=&quot;1646&quot;&gt;📖 2. Membaca Data dari Sel dan Range&lt;/h3&gt;
&lt;p data-end=&quot;1774&quot; data-start=&quot;1689&quot;&gt;Kita bisa mengambil data dari sel tertentu menggunakan &lt;code data-end=&quot;1756&quot; data-start=&quot;1744&quot;&gt;getRange()&lt;/code&gt; dan &lt;code data-end=&quot;1773&quot; data-start=&quot;1761&quot;&gt;getValue()&lt;/code&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1783&quot; data-start=&quot;1776&quot;&gt;Contoh:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1992&quot; data-start=&quot;1784&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;bacaSatuSel&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;A1&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;getValue&lt;/span&gt;();
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Isi sel A1 adalah: &quot;&lt;/span&gt; + data);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2064&quot; data-start=&quot;1994&quot;&gt;Kalau kita ingin membaca banyak data sekaligus, gunakan &lt;code data-end=&quot;2063&quot; data-start=&quot;2050&quot;&gt;getValues()&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2257&quot; data-start=&quot;2065&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;bacaBeberapaSel&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;A1:B5&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;getValues&lt;/span&gt;();
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(data);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2369&quot; data-start=&quot;2259&quot;&gt;&lt;code data-end=&quot;2272&quot; data-start=&quot;2259&quot;&gt;getValues()&lt;/code&gt; akan mengembalikan &lt;strong data-end=&quot;2313&quot; data-start=&quot;2292&quot;&gt;array dua dimensi&lt;/strong&gt;, di mana setiap baris adalah array dari nilai di kolom.&lt;/p&gt;
&lt;hr data-end=&quot;2374&quot; data-start=&quot;2371&quot; /&gt;
&lt;h3 data-end=&quot;2413&quot; data-start=&quot;2376&quot;&gt;✍️ 3. Menulis Data ke Spreadsheet&lt;/h3&gt;
&lt;p data-end=&quot;2505&quot; data-start=&quot;2415&quot;&gt;Untuk menulis data, kita menggunakan fungsi kebalikannya — &lt;code data-end=&quot;2486&quot; data-start=&quot;2474&quot;&gt;setValue()&lt;/code&gt; dan &lt;code data-end=&quot;2504&quot; data-start=&quot;2491&quot;&gt;setValues()&lt;/code&gt;.&lt;/p&gt;
&lt;p data-end=&quot;2524&quot; data-start=&quot;2507&quot;&gt;Contoh sederhana:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2698&quot; data-start=&quot;2525&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tulisData&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;A1&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Halo dari Apps Script!&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2747&quot; data-start=&quot;2700&quot;&gt;Jika kita ingin menulis banyak nilai sekaligus:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3035&quot; data-start=&quot;2748&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tulisBeberapaData&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; data = [
    [&lt;span class=&quot;hljs-string&quot;&gt;&quot;Nama&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Kota&quot;&lt;/span&gt;],
    [&lt;span class=&quot;hljs-string&quot;&gt;&quot;Bagus&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Yogyakarta&quot;&lt;/span&gt;],
    [&lt;span class=&quot;hljs-string&quot;&gt;&quot;Rina&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Bandung&quot;&lt;/span&gt;],
    [&lt;span class=&quot;hljs-string&quot;&gt;&quot;Dewi&quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;Jakarta&quot;&lt;/span&gt;]
  ];
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;A1:B4&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValues&lt;/span&gt;(data);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;3040&quot; data-start=&quot;3037&quot; /&gt;
&lt;h3 data-end=&quot;3082&quot; data-start=&quot;3042&quot;&gt;➕ 4. Menambahkan Baris Baru Otomatis&lt;/h3&gt;
&lt;p data-end=&quot;3179&quot; data-start=&quot;3084&quot;&gt;Kita bisa menambahkan data baru ke baris terakhir yang berisi data, menggunakan &lt;code data-end=&quot;3178&quot; data-start=&quot;3164&quot;&gt;getLastRow()&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3408&quot; data-start=&quot;3181&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tambahBarisBaru&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; barisBaru = sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getLastRow&lt;/span&gt;() + &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;;
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(barisBaru, &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Data baru otomatis&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3517&quot; data-start=&quot;3410&quot;&gt;Setiap kali fungsi dijalankan, data baru akan ditulis di baris paling bawah, tanpa menimpa data sebelumnya.&lt;/p&gt;
&lt;hr data-end=&quot;3522&quot; data-start=&quot;3519&quot; /&gt;
&lt;h3 data-end=&quot;3557&quot; data-start=&quot;3524&quot;&gt;🎨 5. Membuat Format Otomatis&lt;/h3&gt;
&lt;p data-end=&quot;3656&quot; data-start=&quot;3559&quot;&gt;Apps Script juga bisa membantu kita mengatur format sel, warna, dan ukuran kolom secara otomatis.&lt;/p&gt;
&lt;p data-end=&quot;3665&quot; data-start=&quot;3658&quot;&gt;Contoh:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3924&quot; data-start=&quot;3666&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;formatTabel&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; range = sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;A1:B1&quot;&lt;/span&gt;);
  
  range.&lt;span class=&quot;hljs-title function_&quot;&gt;setFontWeight&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;bold&quot;&lt;/span&gt;);
  range.&lt;span class=&quot;hljs-title function_&quot;&gt;setBackground&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;#f2f2f2&quot;&lt;/span&gt;);
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;autoResizeColumns&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4050&quot; data-start=&quot;3926&quot;&gt;Hasilnya, baris pertama akan diformat dengan huruf tebal, latar belakang abu-abu muda, dan lebar kolom disesuaikan otomatis.&lt;/p&gt;
&lt;hr data-end=&quot;4055&quot; data-start=&quot;4052&quot; /&gt;
&lt;h3 data-end=&quot;4112&quot; data-start=&quot;4057&quot;&gt;🧮 6. Latihan Mini: Membuat Log Aktivitas Sederhana&lt;/h3&gt;
&lt;p data-end=&quot;4151&quot; data-start=&quot;4114&quot;&gt;Kita buat contoh sederhana yang akan:&lt;/p&gt;
&lt;ol data-end=&quot;4223&quot; data-start=&quot;4152&quot;&gt;
&lt;li data-end=&quot;4178&quot; data-start=&quot;4152&quot;&gt;
&lt;p data-end=&quot;4178&quot; data-start=&quot;4155&quot;&gt;Menambahkan baris baru,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4223&quot; data-start=&quot;4179&quot;&gt;
&lt;p data-end=&quot;4223&quot; data-start=&quot;4182&quot;&gt;Menulis nama dan waktu eksekusi otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4516&quot; data-start=&quot;4225&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;logAktivitas&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; baris = sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getLastRow&lt;/span&gt;() + &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;;
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; waktu = &lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;();
  
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(baris, &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Aktivitas otomatis&quot;&lt;/span&gt;);
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(baris, &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(waktu);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4598&quot; data-start=&quot;4518&quot;&gt;Setiap kali dijalankan, fungsi ini akan menambahkan log baru di bawah data lama.&lt;/p&gt;&lt;p data-end=&quot;4598&quot; data-start=&quot;4518&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiGT7d_xcoDqiNZh11HB2PV_6bPxTqWtehkqIY4rMkZndBQcfjeiztnycslknvrF4BGQuvkFiZ8H4JiQ6l-gGHQFp_i6vYzM3QoH6K62Kv1SWmEyFrWgS8Hjl3j8snm8k6CslMrubK5WVYdrl7_UAyENOtBiT_G29rpzFR96tfXpxBG76bv-ZXqESuMXqNP&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Mengotomasi Google Sheets Menggunakan Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiGT7d_xcoDqiNZh11HB2PV_6bPxTqWtehkqIY4rMkZndBQcfjeiztnycslknvrF4BGQuvkFiZ8H4JiQ6l-gGHQFp_i6vYzM3QoH6K62Kv1SWmEyFrWgS8Hjl3j8snm8k6CslMrubK5WVYdrl7_UAyENOtBiT_G29rpzFR96tfXpxBG76bv-ZXqESuMXqNP=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgVOX_0DGskuMW2Vc_cejI6cQXYSeeC-zqIFz4G1sqRI8YN9VZi28nUN1ln0aTeYxgQA94yzx-B4eeKttz2JlAr9eyKZ_DSGB6g_B0qwd3HQivbEFT7xih5CEtXWe_i4-QtCSNB8gQOJjz2O62sgzLhWu_Hggpst52UTPOHXe4yl2Va6vTu7rso752rNkP_&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Mengotomasi Google Sheets Menggunakan Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgVOX_0DGskuMW2Vc_cejI6cQXYSeeC-zqIFz4G1sqRI8YN9VZi28nUN1ln0aTeYxgQA94yzx-B4eeKttz2JlAr9eyKZ_DSGB6g_B0qwd3HQivbEFT7xih5CEtXWe_i4-QtCSNB8gQOJjz2O62sgzLhWu_Hggpst52UTPOHXe4yl2Va6vTu7rso752rNkP_=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;4603&quot; data-start=&quot;4600&quot; /&gt;
&lt;h3 data-end=&quot;4666&quot; data-start=&quot;4605&quot;&gt;⏰ 7. Membuat Fungsi Auto Timestamp (Otomatis Saat Diedit)&lt;/h3&gt;
&lt;p data-end=&quot;4806&quot; data-start=&quot;4668&quot;&gt;Kadang kita ingin menambahkan tanggal/waktu otomatis setiap kali isi sel berubah.&lt;br data-end=&quot;4752&quot; data-start=&quot;4749&quot; /&gt;
Kita bisa membuat fungsi &lt;em data-end=&quot;4795&quot; data-start=&quot;4777&quot;&gt;trigger onEdit()&lt;/em&gt; untuk itu:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;5037&quot; data-start=&quot;4808&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onEdit&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;e&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = e.&lt;span class=&quot;hljs-property&quot;&gt;source&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; range = e.&lt;span class=&quot;hljs-property&quot;&gt;range&lt;/span&gt;;

  &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (range.&lt;span class=&quot;hljs-title function_&quot;&gt;getColumn&lt;/span&gt;() === &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt; &amp;amp;&amp;amp; range.&lt;span class=&quot;hljs-title function_&quot;&gt;getRow&lt;/span&gt;() &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;) { 
    sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(range.&lt;span class=&quot;hljs-title function_&quot;&gt;getRow&lt;/span&gt;(), &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot;&gt;Date&lt;/span&gt;());
  }
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjslaqleKA5l3Z0O6_35I9mrY1F4CMyN15cHVoqvdGFsGOD5NyrtshG119YG8X53R8X-rO4oQHs-oje6kD7-FUtoNRPIsnGCh6PsRr-sxlPug6P9W66VNsuuzQdktQwljqNqYgR7HsWids2YrWvLGeffCS2vMv1aAmR3qvHZ3nBIsjPokMLK9geLkoOg8Z-&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Mengotomasi Google Sheets Menggunakan Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjslaqleKA5l3Z0O6_35I9mrY1F4CMyN15cHVoqvdGFsGOD5NyrtshG119YG8X53R8X-rO4oQHs-oje6kD7-FUtoNRPIsnGCh6PsRr-sxlPug6P9W66VNsuuzQdktQwljqNqYgR7HsWids2YrWvLGeffCS2vMv1aAmR3qvHZ3nBIsjPokMLK9geLkoOg8Z-=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;5050&quot; data-start=&quot;5039&quot;&gt;Penjelasan:&lt;/p&gt;
&lt;ul data-end=&quot;5311&quot; data-start=&quot;5051&quot;&gt;
&lt;li data-end=&quot;5133&quot; data-start=&quot;5051&quot;&gt;
&lt;p data-end=&quot;5133&quot; data-start=&quot;5053&quot;&gt;Fungsi ini berjalan otomatis setiap kali kita mengedit sesuatu di spreadsheet.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5215&quot; data-start=&quot;5134&quot;&gt;
&lt;p data-end=&quot;5215&quot; data-start=&quot;5136&quot;&gt;Jika perubahan terjadi di kolom A, maka kolom B akan diisi dengan waktu edit.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5311&quot; data-start=&quot;5216&quot;&gt;
&lt;p data-end=&quot;5311&quot; data-start=&quot;5218&quot;&gt;Ini sangat berguna untuk membuat &lt;em data-end=&quot;5266&quot; data-start=&quot;5251&quot;&gt;log aktivitas&lt;/em&gt;, &lt;em data-end=&quot;5285&quot; data-start=&quot;5268&quot;&gt;tracking update&lt;/em&gt;, atau &lt;em data-end=&quot;5310&quot; data-start=&quot;5292&quot;&gt;absensi otomatis&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiLJl9mCX2Yec2cr8YpwTeaFaf8qO6TOtowAPDNwKvFSkLfuBeZjQQYUdauQHomxXf02MTk0Iy2n9vFijpwCw0gRZe3lQ8NX5GafkLQ3SjB6QrIPsMr2TwyfxaaS0_kp7zF43EkBFUMJs-iBa8bGObjojfsw2PKfV7XSN0zBSmuCXsBGZGFa6Uio0EbtY0O&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Mengotomasi Google Sheets Menggunakan Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiLJl9mCX2Yec2cr8YpwTeaFaf8qO6TOtowAPDNwKvFSkLfuBeZjQQYUdauQHomxXf02MTk0Iy2n9vFijpwCw0gRZe3lQ8NX5GafkLQ3SjB6QrIPsMr2TwyfxaaS0_kp7zF43EkBFUMJs-iBa8bGObjojfsw2PKfV7XSN0zBSmuCXsBGZGFa6Uio0EbtY0O=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pada seri ini kita sudah belajar banyak hal penting:&lt;/div&gt;
&lt;ul data-end=&quot;5602&quot; data-start=&quot;5390&quot;&gt;
&lt;li data-end=&quot;5438&quot; data-start=&quot;5390&quot;&gt;
&lt;p data-end=&quot;5438&quot; data-start=&quot;5392&quot;&gt;Mengenal objek &lt;code data-end=&quot;5423&quot; data-start=&quot;5407&quot;&gt;SpreadsheetApp&lt;/code&gt; dan &lt;code data-end=&quot;5435&quot; data-start=&quot;5428&quot;&gt;Sheet&lt;/code&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5483&quot; data-start=&quot;5439&quot;&gt;
&lt;p data-end=&quot;5483&quot; data-start=&quot;5441&quot;&gt;Membaca dan menulis data ke spreadsheet,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5512&quot; data-start=&quot;5484&quot;&gt;
&lt;p data-end=&quot;5512&quot; data-start=&quot;5486&quot;&gt;Menambah baris otomatis,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5541&quot; data-start=&quot;5513&quot;&gt;
&lt;p data-end=&quot;5541&quot; data-start=&quot;5515&quot;&gt;Membuat format otomatis,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;5602&quot; data-start=&quot;5542&quot;&gt;
&lt;p data-end=&quot;5602&quot; data-start=&quot;5544&quot;&gt;Dan menambahkan fungsi &lt;em data-end=&quot;5583&quot; data-start=&quot;5567&quot;&gt;auto timestamp&lt;/em&gt; saat data berubah.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5804&quot; data-start=&quot;5604&quot;&gt;Dengan kemampuan ini, kita sudah bisa membuat berbagai otomatisasi kecil yang mempercepat pekerjaan sehari-hari — mulai dari mencatat transaksi otomatis, log aktivitas, hingga format laporan mingguan.&lt;/p&gt;
&lt;hr data-end=&quot;5809&quot; data-start=&quot;5806&quot; /&gt;
&lt;h3 data-end=&quot;5837&quot; data-start=&quot;5811&quot;&gt;📅 Seri Selanjutnya:&lt;/h3&gt;
&lt;p data-end=&quot;6126&quot; data-start=&quot;5838&quot;&gt;&lt;a href=&quot;/2025/10/seri-4-trigger-dan-event-otomatis-di.html&quot;&gt;➡️ &lt;strong data-end=&quot;5902&quot; data-start=&quot;5841&quot;&gt;Seri 4 — Trigger dan Event Otomatis di Google Apps Script&lt;/strong&gt;&lt;/a&gt;&lt;br data-end=&quot;5905&quot; data-start=&quot;5902&quot; /&gt;
Kita akan mempelajari cara menjalankan script tanpa harus menekan tombol &lt;em data-end=&quot;5983&quot; data-start=&quot;5978&quot;&gt;Run&lt;/em&gt; lagi.&lt;br data-end=&quot;5992&quot; data-start=&quot;5989&quot; /&gt;
Script bisa berjalan otomatis saat waktu tertentu, saat dokumen dibuka, atau saat data diubah — semuanya bisa diatur dengan &lt;em data-end=&quot;6125&quot; data-start=&quot;6116&quot;&gt;trigger&lt;/em&gt;.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/5528348077574277388/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-3-mengotomasi-google-sheets.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/5528348077574277388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/5528348077574277388'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-3-mengotomasi-google-sheets.html' title='Seri 3: Mengotomasi Google Sheets Menggunakan Script'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiGT7d_xcoDqiNZh11HB2PV_6bPxTqWtehkqIY4rMkZndBQcfjeiztnycslknvrF4BGQuvkFiZ8H4JiQ6l-gGHQFp_i6vYzM3QoH6K62Kv1SWmEyFrWgS8Hjl3j8snm8k6CslMrubK5WVYdrl7_UAyENOtBiT_G29rpzFR96tfXpxBG76bv-ZXqESuMXqNP=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-5846756379647514871</id><published>2025-10-20T06:18:00.033+07:00</published><updated>2025-10-20T12:44:18.923+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 2: Dasar Pemrograman di Google Apps Script</title><content type='html'>&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;em data-end=&quot;340&quot; data-start=&quot;294&quot;&gt;Mengenal Editor, Fungsi, dan Eksekusi Script&lt;/em&gt;&lt;/h3&gt;
&lt;p data-end=&quot;556&quot; data-start=&quot;365&quot;&gt;&lt;a href=&quot;/2025/10/seri-1-pengenalan-google-apps-script.html&quot;&gt;Di seri sebelumnya&lt;/a&gt;, kita sudah mengenal apa itu &lt;strong data-end=&quot;441&quot; data-start=&quot;413&quot;&gt;Google Apps Script (GAS)&lt;/strong&gt; dan mengapa ia bisa menjadi alat yang sangat membantu untuk mengotomasi pekerjaan di ekosistem Google Workspace.&lt;/p&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;558&quot;&gt;Nah, di seri kedua ini kita akan mulai menulis kode pertamanya. Kita akan berkenalan dengan &lt;strong data-end=&quot;672&quot; data-start=&quot;650&quot;&gt;editor Apps Script&lt;/strong&gt;, memahami &lt;strong data-end=&quot;702&quot; data-start=&quot;683&quot;&gt;struktur fungsi&lt;/strong&gt;, menjalankan script, hingga mempelajari cara membaca &lt;strong data-end=&quot;779&quot; data-start=&quot;756&quot;&gt;log dan pesan error&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;915&quot; data-start=&quot;784&quot;&gt;Tujuannya sederhana: setelah membaca artikel ini, kita sudah bisa menulis dan menjalankan program kecil di GAS dengan benar.&lt;/p&gt;
&lt;hr data-end=&quot;920&quot; data-start=&quot;917&quot; /&gt;
&lt;h3 data-end=&quot;965&quot; data-start=&quot;922&quot;&gt;💻 1. Membuka Google Apps Script Editor&lt;/h3&gt;
&lt;p data-end=&quot;1026&quot; data-start=&quot;967&quot;&gt;Ada dua cara utama untuk membuka editor Google Apps Script:&lt;/p&gt;
&lt;h4 data-end=&quot;1083&quot; data-start=&quot;1028&quot;&gt;&lt;strong data-end=&quot;1083&quot; data-start=&quot;1033&quot;&gt;A. Dari Google Sheets (Container-bound Script)&lt;/strong&gt;&lt;/h4&gt;
&lt;ol data-end=&quot;1329&quot; data-start=&quot;1084&quot;&gt;
&lt;li data-end=&quot;1121&quot; data-start=&quot;1084&quot;&gt;
&lt;p data-end=&quot;1121&quot; data-start=&quot;1087&quot;&gt;Buka dokumen Google Sheets baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1167&quot; data-start=&quot;1122&quot;&gt;
&lt;p data-end=&quot;1167&quot; data-start=&quot;1125&quot;&gt;Pilih menu &lt;strong data-end=&quot;1164&quot; data-start=&quot;1136&quot;&gt;Extensions → Apps Script&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1329&quot; data-start=&quot;1168&quot;&gt;
&lt;p data-end=&quot;1329&quot; data-start=&quot;1171&quot;&gt;Sebuah tab baru akan terbuka berisi editor dengan file bernama &lt;code data-end=&quot;1243&quot; data-start=&quot;1234&quot;&gt;Code.gs&lt;/code&gt;.&lt;br data-end=&quot;1247&quot; data-start=&quot;1244&quot; /&gt;
Inilah tempat kita menulis script yang menempel pada file spreadsheet tersebut.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj88zDD8CU1FqL-eIkDZrUVVR6R7b_buMhN4AcSwUyOsdjgE2ieIsAUxiVL3b_P8qPxJFwOJ1EhqpezNzVQjyayFOUs-Mm_WGVeW2FnxzWBZmWIGCZeQd5DrPI0t88oQxAKG_kSpect0XScFaGWuVz6iXiNQ4c5fDhneSc_iRzG4ow4I1-IvKqiELRHtTn1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Google Sheet Open Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj88zDD8CU1FqL-eIkDZrUVVR6R7b_buMhN4AcSwUyOsdjgE2ieIsAUxiVL3b_P8qPxJFwOJ1EhqpezNzVQjyayFOUs-Mm_WGVeW2FnxzWBZmWIGCZeQd5DrPI0t88oQxAKG_kSpect0XScFaGWuVz6iXiNQ4c5fDhneSc_iRzG4ow4I1-IvKqiELRHtTn1=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;h4 data-end=&quot;1373&quot; data-start=&quot;1331&quot;&gt;&lt;strong data-end=&quot;1373&quot; data-start=&quot;1336&quot;&gt;B. Dari Halaman Utama Apps Script&lt;/strong&gt;&lt;/h4&gt;
&lt;ol data-end=&quot;1527&quot; data-start=&quot;1374&quot;&gt;
&lt;li data-end=&quot;1441&quot; data-start=&quot;1374&quot;&gt;
&lt;p data-end=&quot;1441&quot; data-start=&quot;1377&quot;&gt;Buka &lt;a class=&quot;decorated-link cursor-pointer&quot; data-end=&quot;1438&quot; data-start=&quot;1382&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;https://script.google.com/&lt;span aria-hidden=&quot;true&quot; class=&quot;ms-0.5 inline-block align-middle leading-none&quot;&gt;&lt;svg class=&quot;block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]&quot; data-rtl-flip=&quot;&quot; fill=&quot;currentColor&quot; height=&quot;20&quot; viewbox=&quot;0 0 20 20&quot; width=&quot;20&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M14.3349 13.3301V6.60645L5.47065 15.4707C5.21095 15.7304 4.78895 15.7304 4.52925 15.4707C4.26955 15.211 4.26955 14.789 4.52925 14.5293L13.3935 5.66504H6.66011C6.29284 5.66504 5.99507 5.36727 5.99507 5C5.99507 4.63273 6.29284 4.33496 6.66011 4.33496H14.9999L15.1337 4.34863C15.4369 4.41057 15.665 4.67857 15.665 5V13.3301C15.6649 13.6973 15.3672 13.9951 14.9999 13.9951C14.6327 13.9951 14.335 13.6973 14.3349 13.3301Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1468&quot; data-start=&quot;1442&quot;&gt;
&lt;p data-end=&quot;1468&quot; data-start=&quot;1445&quot;&gt;Klik &lt;strong data-end=&quot;1465&quot; data-start=&quot;1450&quot;&gt;New Project&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1527&quot; data-start=&quot;1469&quot;&gt;
&lt;p data-end=&quot;1527&quot; data-start=&quot;1472&quot;&gt;Beri nama proyeknya, misalnya &lt;em data-end=&quot;1524&quot; data-start=&quot;1502&quot;&gt;“Latihan GAS Seri 2”&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1689&quot; data-start=&quot;1529&quot;&gt;Kedua cara ini menghasilkan editor yang sama, hanya saja script dari Sheets terikat pada dokumen tertentu, sedangkan proyek baru berdiri sendiri (&lt;em data-end=&quot;1687&quot; data-start=&quot;1675&quot;&gt;standalone&lt;/em&gt;).&lt;/p&gt;
&lt;hr data-end=&quot;1694&quot; data-start=&quot;1691&quot; /&gt;
&lt;h3 data-end=&quot;1734&quot; data-start=&quot;1696&quot;&gt;🧠 2. Struktur Dasar Fungsi di GAS&lt;/h3&gt;
&lt;p data-end=&quot;1832&quot; data-start=&quot;1736&quot;&gt;Semua kode di Google Apps Script berbentuk &lt;strong data-end=&quot;1800&quot; data-start=&quot;1779&quot;&gt;fungsi JavaScript&lt;/strong&gt;.&lt;br data-end=&quot;1804&quot; data-start=&quot;1801&quot; /&gt;
Bentuk dasarnya seperti ini:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;1904&quot; data-start=&quot;1834&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;namaFungsi&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-comment&quot;&gt;// blok perintah di sini&lt;/span&gt;
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2030&quot; data-start=&quot;1906&quot;&gt;Setiap fungsi akan dijalankan secara manual atau otomatis tergantung cara pemanggilannya.&lt;br data-end=&quot;1998&quot; data-start=&quot;1995&quot; /&gt;
Mari kita buat fungsi sederhana:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2121&quot; data-start=&quot;2032&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;haloDunia&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Halo dari Google Apps Script!&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiSmReYJvxr9qBJHpwlVuq2q_LAmY9_IAUiKVLBW0I3-S-xYhDwkmfbrnHNCubPnXU3Iey2FUFBKg-PfhMsYTFzb3MU06ee96sNYzRfcNP2-RNb7qoJfkkxt3yBK806rWKvzna4Cw5-dsQ0O7Ez13U6r9zqX2mIlpwrbanZXodWXenq8HVRUX5Her3QH821&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiSmReYJvxr9qBJHpwlVuq2q_LAmY9_IAUiKVLBW0I3-S-xYhDwkmfbrnHNCubPnXU3Iey2FUFBKg-PfhMsYTFzb3MU06ee96sNYzRfcNP2-RNb7qoJfkkxt3yBK806rWKvzna4Cw5-dsQ0O7Ez13U6r9zqX2mIlpwrbanZXodWXenq8HVRUX5Her3QH821=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2144&quot; data-start=&quot;2123&quot;&gt;Untuk menjalankannya:&lt;/p&gt;
&lt;ol data-end=&quot;2278&quot; data-start=&quot;2145&quot;&gt;
&lt;li data-end=&quot;2188&quot; data-start=&quot;2145&quot;&gt;
&lt;p data-end=&quot;2188&quot; data-start=&quot;2148&quot;&gt;Klik tombol ▶️ &lt;strong data-end=&quot;2170&quot; data-start=&quot;2163&quot;&gt;Run&lt;/strong&gt; di atas editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2223&quot; data-start=&quot;2189&quot;&gt;
&lt;p data-end=&quot;2223&quot; data-start=&quot;2192&quot;&gt;Tunggu hingga proses selesai.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2278&quot; data-start=&quot;2224&quot;&gt;
&lt;p data-end=&quot;2278&quot; data-start=&quot;2227&quot;&gt;Pada bagian bawah akan muncul execution log&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjFjqikY2Mjq-RP3TQZSkWlEIrVAmvlvpmVUteVtaxHGMQdiMZqJiHxvgpZIuO7yW5RrLcemMiWsxpKILc-Z_E_yPGIWVGzG9QD22yXckyCwejaLK_D9-8WhFcTs5Gw3w5ijbel_apCEWf6UNgnkXk5FyVq9hobEUZck8Eaecq0mlEOVyddzCPksvkjWiVy&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;execution log&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjFjqikY2Mjq-RP3TQZSkWlEIrVAmvlvpmVUteVtaxHGMQdiMZqJiHxvgpZIuO7yW5RrLcemMiWsxpKILc-Z_E_yPGIWVGzG9QD22yXckyCwejaLK_D9-8WhFcTs5Gw3w5ijbel_apCEWf6UNgnkXk5FyVq9hobEUZck8Eaecq0mlEOVyddzCPksvkjWiVy=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p data-end=&quot;2304&quot; data-start=&quot;2280&quot;&gt;Kita akan melihat pesan:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2349&quot; data-start=&quot;2305&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;[&lt;span class=&quot;hljs-meta&quot;&gt;INFO&lt;/span&gt;] Halo dari Google Apps Script!
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2354&quot; data-start=&quot;2351&quot; /&gt;
&lt;h3 data-end=&quot;2414&quot; data-start=&quot;2356&quot;&gt;🚀 3. Menjalankan Script Pertama Kali dan Memberi Izin&lt;/h3&gt;
&lt;p data-end=&quot;2527&quot; data-start=&quot;2416&quot;&gt;Saat pertama kali menjalankan script, Google akan meminta izin untuk mengakses data di akun kita.&lt;br data-end=&quot;2516&quot; data-start=&quot;2513&quot; /&gt;
Langkahnya:&lt;/p&gt;
&lt;ol data-end=&quot;2721&quot; data-start=&quot;2528&quot;&gt;
&lt;li data-end=&quot;2553&quot; data-start=&quot;2528&quot;&gt;
&lt;p data-end=&quot;2553&quot; data-start=&quot;2531&quot;&gt;Klik tombol &lt;strong data-end=&quot;2550&quot; data-start=&quot;2543&quot;&gt;Run&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2554&quot;&gt;
&lt;p data-end=&quot;2628&quot; data-start=&quot;2557&quot;&gt;Muncul dialog &lt;strong data-end=&quot;2597&quot; data-start=&quot;2571&quot;&gt;Authorization required&lt;/strong&gt; → klik &lt;em data-end=&quot;2625&quot; data-start=&quot;2605&quot;&gt;Review permissions&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2657&quot; data-start=&quot;2629&quot;&gt;
&lt;p data-end=&quot;2657&quot; data-start=&quot;2632&quot;&gt;Pilih akun Google kita.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2721&quot; data-start=&quot;2658&quot;&gt;
&lt;p data-end=&quot;2721&quot; data-start=&quot;2661&quot;&gt;Klik &lt;em data-end=&quot;2673&quot; data-start=&quot;2666&quot;&gt;Allow&lt;/em&gt; jika script berasal dari proyek kita sendiri.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjOMacpZHGYrrgvXDUzAgFsAXZ6hwOWKIabNjpoD_HFNdrM2c_MiEtTuHWEZywwudl5d1ozEG2R_Qu87pNq64MXxP8jsH3M2YCct6f2MDmv3fFVUDRW7aWscx5AM9efBYL36PjXG9t42tkrrB6p_4omdgzA37GprML1C_vUjzYrntuw9FJ6EPkAavlmsh7k&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjOMacpZHGYrrgvXDUzAgFsAXZ6hwOWKIabNjpoD_HFNdrM2c_MiEtTuHWEZywwudl5d1ozEG2R_Qu87pNq64MXxP8jsH3M2YCct6f2MDmv3fFVUDRW7aWscx5AM9efBYL36PjXG9t42tkrrB6p_4omdgzA37GprML1C_vUjzYrntuw9FJ6EPkAavlmsh7k=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p data-end=&quot;2864&quot; data-start=&quot;2723&quot;&gt;Proses ini penting karena setiap script yang berinteraksi dengan data pengguna (misalnya Sheets, Gmail, Drive) harus mendapat izin eksplisit.&lt;/p&gt;
&lt;hr data-end=&quot;2869&quot; data-start=&quot;2866&quot; /&gt;
&lt;h3 data-end=&quot;2909&quot; data-start=&quot;2871&quot;&gt;🧾 4. Melihat Hasil Eksekusi &amp;amp; Log&lt;/h3&gt;
&lt;p data-end=&quot;2981&quot; data-start=&quot;2911&quot;&gt;GAS menyediakan cara mudah untuk melihat hasil eksekusi dengan fungsi:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3055&quot; data-start=&quot;2983&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Teks apapun bisa kita tampilkan di sini&quot;&lt;/span&gt;);
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3090&quot; data-start=&quot;3057&quot;&gt;Hasil log bisa kita lihat dengan:&lt;/p&gt;
&lt;ul data-end=&quot;3149&quot; data-start=&quot;3091&quot;&gt;
&lt;li data-end=&quot;3121&quot; data-start=&quot;3091&quot;&gt;
&lt;p data-end=&quot;3121&quot; data-start=&quot;3093&quot;&gt;Menu &lt;strong data-end=&quot;3113&quot; data-start=&quot;3098&quot;&gt;View → Logs&lt;/strong&gt;, atau&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3149&quot; data-start=&quot;3122&quot;&gt;
&lt;p data-end=&quot;3149&quot; data-start=&quot;3124&quot;&gt;Shortcut &lt;code data-end=&quot;3147&quot; data-start=&quot;3133&quot;&gt;Ctrl + Enter&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3195&quot; data-start=&quot;3151&quot;&gt;Selain &lt;code data-end=&quot;3170&quot; data-start=&quot;3158&quot;&gt;Logger.log&lt;/code&gt;, kita juga bisa memakai:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;3241&quot; data-start=&quot;3196&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-variable language_&quot;&gt;console&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Pesan debug&quot;&lt;/span&gt;);
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3306&quot; data-start=&quot;3242&quot;&gt;untuk hasil yang muncul di &lt;strong data-end=&quot;3286&quot; data-start=&quot;3269&quot;&gt;Execution log&lt;/strong&gt; yang lebih lengkap.&lt;/p&gt;
&lt;hr data-end=&quot;3311&quot; data-start=&quot;3308&quot; /&gt;
&lt;h3 data-end=&quot;3344&quot; data-start=&quot;3313&quot;&gt;⚠️ 5. Menangani Error Dasar&lt;/h3&gt;
&lt;p data-end=&quot;3440&quot; data-start=&quot;3346&quot;&gt;Saat menulis kode, error adalah hal biasa. Beberapa kesalahan umum di Apps Script antara lain:&lt;/p&gt;
&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;div class=&quot;group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse&quot; tabindex=&quot;-1&quot;&gt;&lt;table class=&quot;w-fit min-w-(--thread-content-width)&quot; data-end=&quot;3802&quot; data-start=&quot;3442&quot;&gt;&lt;thead data-end=&quot;3485&quot; data-start=&quot;3442&quot;&gt;&lt;tr data-end=&quot;3485&quot; data-start=&quot;3442&quot;&gt;&lt;th data-col-size=&quot;sm&quot; data-end=&quot;3456&quot; data-start=&quot;3442&quot;&gt;Jenis Error&lt;/th&gt;&lt;th data-col-size=&quot;md&quot; data-end=&quot;3467&quot; data-start=&quot;3456&quot;&gt;Penyebab&lt;/th&gt;&lt;th data-col-size=&quot;md&quot; data-end=&quot;3485&quot; data-start=&quot;3467&quot;&gt;Solusi Singkat&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-end=&quot;3802&quot; data-start=&quot;3532&quot;&gt;&lt;tr data-end=&quot;3609&quot; data-start=&quot;3532&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3549&quot; data-start=&quot;3532&quot;&gt;ReferenceError&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;3588&quot; data-start=&quot;3549&quot;&gt;Salah penulisan nama variabel/fungsi&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;3609&quot; data-start=&quot;3588&quot;&gt;Cek kembali ejaan&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;3720&quot; data-start=&quot;3610&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3622&quot; data-start=&quot;3610&quot;&gt;TypeError&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;3667&quot; data-start=&quot;3622&quot;&gt;Memanggil method dari objek yang belum ada&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;3720&quot; data-start=&quot;3667&quot;&gt;Gunakan &lt;code data-end=&quot;3691&quot; data-start=&quot;3677&quot;&gt;Logger.log()&lt;/code&gt; untuk debug nilai variabel&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end=&quot;3802&quot; data-start=&quot;3721&quot;&gt;&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3743&quot; data-start=&quot;3721&quot;&gt;Authorization Error&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;3770&quot; data-start=&quot;3743&quot;&gt;Belum memberi izin akses&lt;/td&gt;&lt;td data-col-size=&quot;md&quot; data-end=&quot;3802&quot; data-start=&quot;3770&quot;&gt;Jalankan ulang dan beri izin&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p data-end=&quot;3815&quot; data-start=&quot;3804&quot;&gt;Tips cepat:&lt;/p&gt;
&lt;ul data-end=&quot;3999&quot; data-start=&quot;3816&quot;&gt;
&lt;li data-end=&quot;3861&quot; data-start=&quot;3816&quot;&gt;
&lt;p data-end=&quot;3861&quot; data-start=&quot;3818&quot;&gt;Gunakan log untuk melacak nilai variabel.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3922&quot; data-start=&quot;3862&quot;&gt;
&lt;p data-end=&quot;3922&quot; data-start=&quot;3864&quot;&gt;Perhatikan baris yang ditunjukkan pesan error di editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3999&quot; data-start=&quot;3923&quot;&gt;
&lt;p data-end=&quot;3999&quot; data-start=&quot;3925&quot;&gt;Baca pesan error dari tab &lt;em data-end=&quot;3963&quot; data-start=&quot;3951&quot;&gt;Executions&lt;/em&gt; untuk detail waktu dan penyebabnya.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4004&quot; data-start=&quot;4001&quot; /&gt;
&lt;h3 data-end=&quot;4066&quot; data-start=&quot;4006&quot;&gt;🧮 6. Contoh Praktik Sederhana: Menulis ke Google Sheets&lt;/h3&gt;
&lt;p data-end=&quot;4138&quot; data-start=&quot;4068&quot;&gt;Sekarang kita buat contoh nyata: menulis data ke sel di Google Sheets.&lt;/p&gt;
&lt;p data-end=&quot;4151&quot; data-start=&quot;4140&quot;&gt;Langkahnya:&lt;/p&gt;
&lt;ol data-end=&quot;4253&quot; data-start=&quot;4153&quot;&gt;
&lt;li data-end=&quot;4180&quot; data-start=&quot;4153&quot;&gt;
&lt;p data-end=&quot;4180&quot; data-start=&quot;4156&quot;&gt;Buka spreadsheet baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4221&quot; data-start=&quot;4181&quot;&gt;
&lt;p data-end=&quot;4221&quot; data-start=&quot;4184&quot;&gt;Pilih &lt;strong data-end=&quot;4218&quot; data-start=&quot;4190&quot;&gt;Extensions → Apps Script&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4253&quot; data-start=&quot;4222&quot;&gt;
&lt;p data-end=&quot;4253&quot; data-start=&quot;4225&quot;&gt;Ganti kode di editor dengan:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4438&quot; data-start=&quot;4255&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;tulisData&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; sheet = &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSpreadsheet&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;getActiveSheet&lt;/span&gt;();
  sheet.&lt;span class=&quot;hljs-title function_&quot;&gt;getRange&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;A1&quot;&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot;&gt;setValue&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Halo, ini data dari Apps Script!&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgYxXcOF0gV4PoL0311MPxTXDFd6vVNAWcW5T8A-OEm9lWaR4ZO5BOD0pLhZzv0fpz1rR0GYHv3xLtwkeP3GDaXtVFmcYmPGpTBG_xmRIoIxkU8zYhNuttMDs69TimC1lc-ZwXnfhOO7b89RbQf43R0z4mmbebW7FwoLJ719Ta3OPyXGloqhuXY6-zXlr1N&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgYxXcOF0gV4PoL0311MPxTXDFd6vVNAWcW5T8A-OEm9lWaR4ZO5BOD0pLhZzv0fpz1rR0GYHv3xLtwkeP3GDaXtVFmcYmPGpTBG_xmRIoIxkU8zYhNuttMDs69TimC1lc-ZwXnfhOO7b89RbQf43R0z4mmbebW7FwoLJ719Ta3OPyXGloqhuXY6-zXlr1N=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ol data-end=&quot;4550&quot; data-start=&quot;4440&quot; start=&quot;4&quot;&gt;
&lt;li data-end=&quot;4485&quot; data-start=&quot;4440&quot;&gt;
&lt;p data-end=&quot;4485&quot; data-start=&quot;4443&quot;&gt;Klik &lt;strong data-end=&quot;4458&quot; data-start=&quot;4448&quot;&gt;Run ▶️&lt;/strong&gt;, beri izin jika diminta.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4550&quot; data-start=&quot;4486&quot;&gt;
&lt;p data-end=&quot;4550&quot; data-start=&quot;4489&quot;&gt;Kembali ke spreadsheet — di sel &lt;strong data-end=&quot;4527&quot; data-start=&quot;4521&quot;&gt;A1&lt;/strong&gt; akan muncul teks baru.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh0ZLfakP8tJ0sDkc1iZJ_-yMZivNycma0J-_jBaaWEIP-RNMdPeF4Ni6mYUu7BmTFU5KsGatN789SkvrxrKqie1cvyg7xwgv2OlA3fhT2LgQe7tqXhvTL_0Er7iWnR9pnrgVUWOWtaJLTBQjx0t_-FkGN1DF84Zg3ODbqofFe9rUe9RD5TDOdH_9CL518t&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh0ZLfakP8tJ0sDkc1iZJ_-yMZivNycma0J-_jBaaWEIP-RNMdPeF4Ni6mYUu7BmTFU5KsGatN789SkvrxrKqie1cvyg7xwgv2OlA3fhT2LgQe7tqXhvTL_0Er7iWnR9pnrgVUWOWtaJLTBQjx0t_-FkGN1DF84Zg3ODbqofFe9rUe9RD5TDOdH_9CL518t=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p data-end=&quot;4641&quot; data-start=&quot;4552&quot;&gt;Dengan hanya tiga baris kode, kita sudah berhasil mengotomatiskan tugas di Google Sheets!&lt;/p&gt;
&lt;hr data-end=&quot;4646&quot; data-start=&quot;4643&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Pada seri ini, kita telah belajar hal-hal mendasar dalam Google Apps Script:&lt;/p&gt;
&lt;ul data-end=&quot;4884&quot; data-start=&quot;4744&quot;&gt;
&lt;li data-end=&quot;4767&quot; data-start=&quot;4744&quot;&gt;
&lt;p data-end=&quot;4767&quot; data-start=&quot;4746&quot;&gt;Cara membuka editor&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4796&quot; data-start=&quot;4768&quot;&gt;
&lt;p data-end=&quot;4796&quot; data-start=&quot;4770&quot;&gt;Menulis fungsi sederhana&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4836&quot; data-start=&quot;4797&quot;&gt;
&lt;p data-end=&quot;4836&quot; data-start=&quot;4799&quot;&gt;Menjalankan dan memberi izin script&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4858&quot; data-start=&quot;4837&quot;&gt;
&lt;p data-end=&quot;4858&quot; data-start=&quot;4839&quot;&gt;Melihat hasil log&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4884&quot; data-start=&quot;4859&quot;&gt;
&lt;p data-end=&quot;4884&quot; data-start=&quot;4861&quot;&gt;Menangani error dasar&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5052&quot; data-start=&quot;4886&quot;&gt;Langkah kecil ini adalah pondasi penting sebelum kita beralih ke hal-hal yang lebih menarik seperti &lt;strong data-end=&quot;5006&quot; data-start=&quot;4986&quot;&gt;trigger otomatis&lt;/strong&gt;, &lt;strong data-end=&quot;5028&quot; data-start=&quot;5008&quot;&gt;pengiriman email&lt;/strong&gt;, dan &lt;strong data-end=&quot;5051&quot; data-start=&quot;5034&quot;&gt;integrasi API&lt;/strong&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;5057&quot; data-start=&quot;5054&quot; /&gt;
&lt;h3 data-end=&quot;5085&quot; data-start=&quot;5059&quot;&gt;📅 Seri Selanjutnya:&lt;/h3&gt;
&lt;p data-end=&quot;5316&quot; data-start=&quot;5086&quot;&gt;➡️ &lt;strong data-end=&quot;5146&quot; data-start=&quot;5089&quot;&gt;Seri 3 — Mengotomasi Google Sheets Menggunakan Script&lt;/strong&gt;&lt;br data-end=&quot;5149&quot; data-start=&quot;5146&quot; /&gt;
Kita akan mulai membuat otomasi nyata di spreadsheet: membaca dan menulis data secara dinamis, menambahkan baris otomatis, dan membuat format yang diatur lewat script.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/5846756379647514871/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-2-dasar-pemrograman-di-google-apps.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/5846756379647514871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/5846756379647514871'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-2-dasar-pemrograman-di-google-apps.html' title='Seri 2: Dasar Pemrograman di Google Apps Script'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEj88zDD8CU1FqL-eIkDZrUVVR6R7b_buMhN4AcSwUyOsdjgE2ieIsAUxiVL3b_P8qPxJFwOJ1EhqpezNzVQjyayFOUs-Mm_WGVeW2FnxzWBZmWIGCZeQd5DrPI0t88oQxAKG_kSpect0XScFaGWuVz6iXiNQ4c5fDhneSc_iRzG4ow4I1-IvKqiELRHtTn1=s72-w640-h360-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-8591319047145950606</id><published>2025-10-19T15:36:00.012+07:00</published><updated>2025-10-21T05:09:17.564+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Seri 1: Pengenalan Google Apps Script</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong data-end=&quot;362&quot; data-start=&quot;321&quot;&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Sudah lama tidak menulis di blog ini. Bukan karena tidak peduli dengan blog ini tapi karena memang banyak kesibukan dan kekurangan bahan postingan. Hal ini disebabkan karena blog ini memang khusus membahas delphi. Karena pertimbangan semakin jarang orang menggunakan Delphi, maka saya putuskan untuk menulis apapun yang bermanfaat bagi para pengunjung. Saya tidak membatasi hanya membahas pemrograman, saya akan menulis apapun. Pada kesempatan kali ini saya akan memulai sebuah tulisan berseri tentang Google Apps Script (GAS). Silakan mengikuti.&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;419&quot; data-start=&quot;363&quot;&gt;&lt;em data-end=&quot;419&quot; data-start=&quot;367&quot;&gt;Langkah Pertama Menuju Otomasi di Google Workspace&lt;/em&gt;&lt;/h3&gt;
&lt;hr data-end=&quot;424&quot; data-start=&quot;421&quot; /&gt;
&lt;h3 data-end=&quot;460&quot; data-start=&quot;426&quot;&gt;🔍 Apa Itu Google Apps Script?&lt;/h3&gt;
&lt;p data-end=&quot;689&quot; data-start=&quot;462&quot;&gt;Bayangkan kita bisa membuat spreadsheet (google sheet) yang otomatis mengirim email, memformat data, atau bahkan berkomunikasi dengan API luar — &lt;strong data-end=&quot;641&quot; data-start=&quot;592&quot;&gt;tanpa server dan tanpa harus install apa pun.&lt;/strong&gt;&lt;br data-end=&quot;644&quot; data-start=&quot;641&quot; /&gt;
Itulah kekuatan &lt;strong data-end=&quot;688&quot; data-start=&quot;660&quot;&gt;Google Apps Script (GAS)&lt;/strong&gt;.&lt;/p&gt;&lt;p data-end=&quot;689&quot; data-start=&quot;462&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgUY23bExQVRpcla1WUux5h8hXEOAHn_uR8rv4O5DMTFYpVR5Y9PM7UkMHXQ1RSAWwvzda7QDCbycMnIKm0r5K7-dEu6uegyokiYdeQxGyfw00N7SvzCSUSussmTwHgaT244jOfpEg8Xo9RR8w9jAmR2Q0O3RhQrD9_A15BpWP9trab8mkpQ0RQgVh5st_y&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 2em;&quot;&gt;&lt;img alt=&quot;google workspace&quot; data-original-height=&quot;519&quot; data-original-width=&quot;519&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgUY23bExQVRpcla1WUux5h8hXEOAHn_uR8rv4O5DMTFYpVR5Y9PM7UkMHXQ1RSAWwvzda7QDCbycMnIKm0r5K7-dEu6uegyokiYdeQxGyfw00N7SvzCSUSussmTwHgaT244jOfpEg8Xo9RR8w9jAmR2Q0O3RhQrD9_A15BpWP9trab8mkpQ0RQgVh5st_y=w320-h320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p data-end=&quot;901&quot; data-start=&quot;691&quot;&gt;&lt;strong data-end=&quot;713&quot; data-start=&quot;691&quot;&gt;Google Apps Script&lt;/strong&gt; adalah platform &lt;em data-end=&quot;742&quot; data-start=&quot;730&quot;&gt;serverless&lt;/em&gt; berbasis JavaScript yang disediakan oleh Google untuk mengotomasi, memperluas, dan mengintegrasikan layanan-layanan di ekosistem &lt;strong data-end=&quot;892&quot; data-start=&quot;872&quot;&gt;Google Workspace&lt;/strong&gt; seperti:&lt;/p&gt;
&lt;ul data-end=&quot;998&quot; data-start=&quot;902&quot;&gt;
&lt;li data-end=&quot;919&quot; data-start=&quot;902&quot;&gt;
&lt;p data-end=&quot;919&quot; data-start=&quot;904&quot;&gt;Google Sheets&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;935&quot; data-start=&quot;920&quot;&gt;
&lt;p data-end=&quot;935&quot; data-start=&quot;922&quot;&gt;Google Docs&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;936&quot;&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;938&quot;&gt;Google Drive&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;962&quot; data-start=&quot;953&quot;&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;955&quot;&gt;Gmail&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;982&quot; data-start=&quot;963&quot;&gt;
&lt;p data-end=&quot;982&quot; data-start=&quot;965&quot;&gt;Google Calendar&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;983&quot;&gt;
&lt;p data-end=&quot;998&quot; data-start=&quot;985&quot;&gt;dan lainnya&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1124&quot; data-start=&quot;1000&quot;&gt;Jadi, kita bisa menganggapnya sebagai “otak tambahan” di balik aplikasi-aplikasi Google yang biasa kita gunakan setiap hari.&lt;/p&gt;
&lt;hr data-end=&quot;1129&quot; data-start=&quot;1126&quot; /&gt;
&lt;h3 data-end=&quot;1173&quot; data-start=&quot;1131&quot;&gt;⚙️ Mengapa Google Apps Script Penting?&lt;/h3&gt;
&lt;p data-end=&quot;1364&quot; data-start=&quot;1175&quot;&gt;Bagi pengguna biasa, GAS bisa membantu menghemat waktu dengan mengotomasi pekerjaan berulang.&lt;br data-end=&quot;1271&quot; data-start=&quot;1268&quot; /&gt;
Bagi programmer, GAS adalah &lt;em data-end=&quot;1318&quot; data-start=&quot;1299&quot;&gt;pintu masuk cepat&lt;/em&gt; ke dunia &lt;strong data-end=&quot;1363&quot; data-start=&quot;1328&quot;&gt;otomasi cloud dan integrasi API&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1394&quot; data-start=&quot;1366&quot;&gt;Beberapa contoh kegunaannya:&lt;/p&gt;
&lt;ul data-end=&quot;1654&quot; data-start=&quot;1395&quot;&gt;
&lt;li data-end=&quot;1450&quot; data-start=&quot;1395&quot;&gt;
&lt;p data-end=&quot;1450&quot; data-start=&quot;1397&quot;&gt;Mengirim laporan otomatis setiap minggu lewat email&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1498&quot; data-start=&quot;1451&quot;&gt;
&lt;p data-end=&quot;1498&quot; data-start=&quot;1453&quot;&gt;Membuat format data otomatis di spreadsheet&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1572&quot; data-start=&quot;1499&quot;&gt;
&lt;p data-end=&quot;1572&quot; data-start=&quot;1501&quot;&gt;Mengambil data dari API eksternal dan menampilkannya di Google Sheets&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1654&quot; data-start=&quot;1573&quot;&gt;
&lt;p data-end=&quot;1654&quot; data-start=&quot;1575&quot;&gt;Membuat dashboard mini berbasis web menggunakan Google Sheet sebagai database&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1659&quot; data-start=&quot;1656&quot; /&gt;
&lt;h3 data-end=&quot;1689&quot; data-start=&quot;1661&quot;&gt;🧠 Bahasa yang Digunakan&lt;/h3&gt;
&lt;p data-end=&quot;1896&quot; data-start=&quot;1691&quot;&gt;Google Apps Script menggunakan sintaks &lt;strong data-end=&quot;1768&quot; data-start=&quot;1730&quot;&gt;JavaScript modern (ECMAScript 5+).&lt;/strong&gt;&lt;br data-end=&quot;1771&quot; data-start=&quot;1768&quot; /&gt;
Artinya, jika kita sudah familiar dengan JavaScript di web, kita bisa langsung menulis script-nya tanpa banyak belajar ulang.&lt;/p&gt;
&lt;p data-end=&quot;1922&quot; data-start=&quot;1898&quot;&gt;Contoh paling sederhana:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2011&quot; data-start=&quot;1924&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;helloWorld&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;Logger&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Hello, Google Apps Script!&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2107&quot; data-start=&quot;2013&quot;&gt;Jika kita menjalankan kode ini, hasilnya akan muncul di tab &lt;strong data-end=&quot;2090&quot; data-start=&quot;2073&quot;&gt;Execution Log&lt;/strong&gt; seperti berikut:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2149&quot; data-start=&quot;2108&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;[&lt;span class=&quot;hljs-meta&quot;&gt;INFO&lt;/span&gt;] Hello, Google Apps Script!
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2154&quot; data-start=&quot;2151&quot; /&gt;
&lt;h3 data-end=&quot;2210&quot; data-start=&quot;2156&quot;&gt;🚀 Dua Jenis Script: Container-bound vs Standalone&lt;/h3&gt;
&lt;p data-end=&quot;2260&quot; data-start=&quot;2212&quot;&gt;Google Apps Script bisa dibuat dalam dua bentuk:&lt;/p&gt;
&lt;ol data-end=&quot;2679&quot; data-start=&quot;2262&quot;&gt;
&lt;li data-end=&quot;2467&quot; data-start=&quot;2262&quot;&gt;
&lt;p data-end=&quot;2425&quot; data-start=&quot;2265&quot;&gt;&lt;strong data-end=&quot;2291&quot; data-start=&quot;2265&quot;&gt;Container-bound script&lt;/strong&gt;&lt;br data-end=&quot;2294&quot; data-start=&quot;2291&quot; /&gt;
Script yang “menempel” pada dokumen seperti Google Sheet, Google Form, atau Google Doc.&lt;br data-end=&quot;2387&quot; data-start=&quot;2384&quot; /&gt;
Biasanya dibuat langsung dari menu:&lt;/p&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2467&quot; data-start=&quot;2429&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;&lt;span class=&quot;hljs-attribute&quot;&gt;Extensions&lt;/span&gt; → Apps Script
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2679&quot; data-start=&quot;2469&quot;&gt;
&lt;p data-end=&quot;2679&quot; data-start=&quot;2472&quot;&gt;&lt;strong data-end=&quot;2493&quot; data-start=&quot;2472&quot;&gt;Standalone script&lt;/strong&gt;&lt;br data-end=&quot;2496&quot; data-start=&quot;2493&quot; /&gt;
Script yang berdiri sendiri, bisa diakses lewat:&lt;br data-end=&quot;2550&quot; data-start=&quot;2547&quot; /&gt;
&lt;a class=&quot;decorated-link cursor-pointer&quot; data-end=&quot;2609&quot; data-start=&quot;2553&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;https://script.google.com/&lt;span aria-hidden=&quot;true&quot; class=&quot;ms-0.5 inline-block align-middle leading-none&quot;&gt;&lt;svg class=&quot;block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]&quot; data-rtl-flip=&quot;&quot; fill=&quot;currentColor&quot; height=&quot;20&quot; viewbox=&quot;0 0 20 20&quot; width=&quot;20&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M14.3349 13.3301V6.60645L5.47065 15.4707C5.21095 15.7304 4.78895 15.7304 4.52925 15.4707C4.26955 15.211 4.26955 14.789 4.52925 14.5293L13.3935 5.66504H6.66011C6.29284 5.66504 5.99507 5.36727 5.99507 5C5.99507 4.63273 6.29284 4.33496 6.66011 4.33496H14.9999L15.1337 4.34863C15.4369 4.41057 15.665 4.67857 15.665 5V13.3301C15.6649 13.6973 15.3672 13.9951 14.9999 13.9951C14.6327 13.9951 14.335 13.6973 14.3349 13.3301Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;br data-end=&quot;2612&quot; data-start=&quot;2609&quot; /&gt;
Jenis ini cocok untuk proyek besar atau integrasi API eksternal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2684&quot; data-start=&quot;2681&quot; /&gt;
&lt;h3 data-end=&quot;2728&quot; data-start=&quot;2686&quot;&gt;🧩 Contoh: Hello World di Google Sheet&lt;/h3&gt;
&lt;p data-end=&quot;2757&quot; data-start=&quot;2730&quot;&gt;Coba langkah sederhana ini:&lt;/p&gt;
&lt;ol data-end=&quot;2865&quot; data-start=&quot;2758&quot;&gt;
&lt;li data-end=&quot;2787&quot; data-start=&quot;2758&quot;&gt;
&lt;p data-end=&quot;2787&quot; data-start=&quot;2761&quot;&gt;Buka Google Sheets baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2827&quot; data-start=&quot;2788&quot;&gt;
&lt;p data-end=&quot;2827&quot; data-start=&quot;2791&quot;&gt;Klik &lt;strong data-end=&quot;2824&quot; data-start=&quot;2796&quot;&gt;Extensions → Apps Script&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2865&quot; data-start=&quot;2828&quot;&gt;
&lt;p data-end=&quot;2865&quot; data-start=&quot;2831&quot;&gt;Hapus isi editor dan ganti dengan:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;2971&quot; data-start=&quot;2867&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;onOpen&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;&lt;/span&gt;) {
  &lt;span class=&quot;hljs-title class_&quot;&gt;SpreadsheetApp&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;getUi&lt;/span&gt;().&lt;span class=&quot;hljs-title function_&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&quot;Halo dari Google Apps Script!&quot;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre! language-javascript&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj-31X6bykw0gKZY98a18GGbQgYh4d-3LxPQnZG5KtOKdcoWxyYVx1rw1LtjB8RN9_OQ_ZD8MQoXn0HJMbYViaE9C2Yvq21jXSpD3MpTWWoo5xqdrLEphwWlk2PXKmQ8rIfuIUprz8s1yuq8cHRtcKl12Jo41Lbk3gyHZlzHGcm9V-sgaG8z1oE-eZPteYI&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj-31X6bykw0gKZY98a18GGbQgYh4d-3LxPQnZG5KtOKdcoWxyYVx1rw1LtjB8RN9_OQ_ZD8MQoXn0HJMbYViaE9C2Yvq21jXSpD3MpTWWoo5xqdrLEphwWlk2PXKmQ8rIfuIUprz8s1yuq8cHRtcKl12Jo41Lbk3gyHZlzHGcm9V-sgaG8z1oE-eZPteYI=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ol data-end=&quot;3156&quot; data-start=&quot;2973&quot; start=&quot;4&quot;&gt;
&lt;li data-end=&quot;3024&quot; data-start=&quot;2973&quot;&gt;
&lt;p data-end=&quot;3024&quot; data-start=&quot;2976&quot;&gt;Klik tombol &lt;strong data-end=&quot;2998&quot; data-start=&quot;2988&quot;&gt;Run ▶️&lt;/strong&gt;, lalu berikan izin akses.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3156&quot; data-start=&quot;3025&quot;&gt;
&lt;p data-end=&quot;3156&quot; data-start=&quot;3028&quot;&gt;Kembali ke Google Sheets, &lt;em data-end=&quot;3062&quot; data-start=&quot;3054&quot;&gt;reload&lt;/em&gt; halaman.&lt;br data-end=&quot;3074&quot; data-start=&quot;3071&quot; /&gt;
Kita akan melihat pesan pop-up muncul:&lt;br data-end=&quot;3118&quot; data-start=&quot;3115&quot; /&gt;
&lt;strong data-end=&quot;3156&quot; data-start=&quot;3121&quot;&gt;“Halo dari Google Apps Script!”&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;b&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhhssoYdqiI4ipBmhH0PkQLHmHGN_qljxG99wtcJGy9F7w2CyZOaTs4gb5iWK4WVLTlUd8OwRvTwNYhl2Brx6MzU94gAGAYKNcR5mGdfclWHamqIa1OXIMHS7ri8e4uH96I82Ud3sIsmA--ukDQK_Krt5p0p4ajZYkgyONgfNjg_uhKNVodazJcKRu5I0Pa&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Google Apps Script&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1366&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhhssoYdqiI4ipBmhH0PkQLHmHGN_qljxG99wtcJGy9F7w2CyZOaTs4gb5iWK4WVLTlUd8OwRvTwNYhl2Brx6MzU94gAGAYKNcR5mGdfclWHamqIa1OXIMHS7ri8e4uH96I82Ud3sIsmA--ukDQK_Krt5p0p4ajZYkgyONgfNjg_uhKNVodazJcKRu5I0Pa=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;p data-end=&quot;3210&quot; data-start=&quot;3158&quot;&gt;🎉 Selamat! Kita baru saja menulis script pertama kita.&lt;/p&gt;
&lt;hr data-end=&quot;3215&quot; data-start=&quot;3212&quot; /&gt;
&lt;h3 data-end=&quot;3264&quot; data-start=&quot;3217&quot;&gt;🧭 Kapan Sebaiknya Menggunakan Apps Script?&lt;/h3&gt;
&lt;p data-end=&quot;3304&quot; data-start=&quot;3266&quot;&gt;Gunakan Apps Script ketika kita ingin:&lt;/p&gt;
&lt;ul data-end=&quot;3535&quot; data-start=&quot;3305&quot;&gt;
&lt;li data-end=&quot;3359&quot; data-start=&quot;3305&quot;&gt;
&lt;p data-end=&quot;3359&quot; data-start=&quot;3307&quot;&gt;Mengotomasi pekerjaan berulang di Google Workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3417&quot; data-start=&quot;3360&quot;&gt;
&lt;p data-end=&quot;3417&quot; data-start=&quot;3362&quot;&gt;Menghubungkan beberapa layanan Google secara otomatis&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3477&quot; data-start=&quot;3418&quot;&gt;
&lt;p data-end=&quot;3477&quot; data-start=&quot;3420&quot;&gt;Membuat aplikasi ringan tanpa perlu hosting atau server&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3535&quot; data-start=&quot;3478&quot;&gt;
&lt;p data-end=&quot;3535&quot; data-start=&quot;3480&quot;&gt;Mengembangkan solusi cepat tanpa kompleksitas backend&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3540&quot; data-start=&quot;3537&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;Demikian tadi pengantar tentang google apps script. Semoga dengan pengantar ini bisa menjadi modal awal kita untuk mempelajarai tools keren ini.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3814&quot; data-start=&quot;3811&quot; /&gt;
&lt;h3 data-end=&quot;3842&quot; data-start=&quot;3816&quot;&gt;📅 Seri Selanjutnya:&lt;/h3&gt;
&lt;p data-end=&quot;4056&quot; data-start=&quot;3843&quot;&gt;&lt;a href=&quot;/2025/10/seri-2-dasar-pemrograman-di-google-apps.html&quot;&gt;➡️ &lt;strong data-end=&quot;3898&quot; data-start=&quot;3846&quot;&gt;Seri 2 — Dasar Pemrograman di Google Apps Script&lt;/strong&gt;&lt;/a&gt;&lt;br data-end=&quot;3901&quot; data-start=&quot;3898&quot; /&gt;
Kita akan belajar struktur kode, fungsi, dan cara mengeksekusi script dengan benar, termasuk mengenal &lt;em data-end=&quot;4024&quot; data-start=&quot;4003&quot;&gt;authorization scope&lt;/em&gt; serta error yang sering muncul.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/8591319047145950606/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-1-pengenalan-google-apps-script.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8591319047145950606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8591319047145950606'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2025/10/seri-1-pengenalan-google-apps-script.html' title='Seri 1: Pengenalan Google Apps Script'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgUY23bExQVRpcla1WUux5h8hXEOAHn_uR8rv4O5DMTFYpVR5Y9PM7UkMHXQ1RSAWwvzda7QDCbycMnIKm0r5K7-dEu6uegyokiYdeQxGyfw00N7SvzCSUSussmTwHgaT244jOfpEg8Xo9RR8w9jAmR2Q0O3RhQrD9_A15BpWP9trab8mkpQ0RQgVh5st_y=s72-w320-h320-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-3231539884821157607</id><published>2023-07-09T13:09:00.016+07:00</published><updated>2025-10-18T19:35:37.432+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="Self Improvement"/><title type='text'>Menjadi Programmer Polyglot: Menguasai Beberapa Bahasa Pemrograman untuk Sukses yang Lebih Luar Biasa</title><content type='html'>Dalam era teknologi saat ini, menjadi seorang programmer yang mahir dalam satu bahasa pemrograman saja tidak lagi cukup untuk mencapai kesuksesan di dunia pengembangan perangkat lunak. Kebutuhan industri yang terus berkembang dan tuntutan proyek yang semakin kompleks membutuhkan kemampuan untuk menguasai beberapa bahasa pemrograman secara bersamaan. Kemampuan ini dikenal sebagai &quot;polyglot programming&quot; atau menjadi programmer polyglot&amp;nbsp;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;1. Mengapa Menjadi Programmer Polyglot Penting?&lt;/h3&gt;&lt;div&gt;Dalam dunia pemrograman, setiap bahasa pemrograman memiliki kelebihan dan kekurangannya masing-masing. Tidak ada bahasa pemrograman yang sempurna untuk semua jenis proyek. Oleh karena itu, sebagai seorang programmer, memiliki kemampuan untuk menggunakan beberapa bahasa pemrograman memberikan fleksibilitas dan keleluasaan dalam memilih bahasa yang paling sesuai dengan tuntutan proyek yang sedang dikerjakan.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOnIT0ptaevWBAMVM0qnc43eZYsfWuI19TnowDN7fLKMtecNGd73FtgCyY2mhAfG8wR5qyR5jgTObnisLjGWw_ALXCV3gS5O1jdBU9oBwpMmuuJMv-RvS0LhKO4cl6-nqI4EEmyQmmdxW18wGn13qyJgTpLi3bnp4WSatLY20KxJbVX7SB1eIZjUlhxTk/s1280/Red%20Modern%20Programming%20YouTube%20Thumbnail.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;polyglot&quot; border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOnIT0ptaevWBAMVM0qnc43eZYsfWuI19TnowDN7fLKMtecNGd73FtgCyY2mhAfG8wR5qyR5jgTObnisLjGWw_ALXCV3gS5O1jdBU9oBwpMmuuJMv-RvS0LhKO4cl6-nqI4EEmyQmmdxW18wGn13qyJgTpLi3bnp4WSatLY20KxJbVX7SB1eIZjUlhxTk/w400-h225/Red%20Modern%20Programming%20YouTube%20Thumbnail.png&quot; title=&quot;polyglot&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Selain itu, menjadi programmer polyglot juga membantu meningkatkan pemahaman dan wawasan Anda tentang konsep pemrograman secara keseluruhan. Setiap bahasa pemrograman memiliki paradigma dan gaya pemrograman yang berbeda, dan dengan menguasai beberapa bahasa, Anda akan terpapar pada berbagai paradigma dan teknik pemrograman. Hal ini membantu dalam mengembangkan pola pikir yang lebih luas dan memungkinkan Anda melihat masalah dari berbagai perspektif, yang dapat memunculkan solusi yang lebih inovatif.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;2. Manfaat Menjadi Programmer Polyglot&lt;/h3&gt;&lt;div&gt;&lt;b&gt;a. Fleksibilitas dalam Memilih Bahasa yang Tepat&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Dengan menguasai beberapa bahasa pemrograman, Anda memiliki fleksibilitas untuk memilih bahasa yang paling sesuai dengan tuntutan proyek yang sedang Anda kerjakan. Jika proyek membutuhkan performa tinggi, Anda dapat memilih bahasa pemrograman yang terkenal karena kecepatan eksekusinya, seperti C++ atau Go. Sementara untuk pengembangan web, Anda dapat memilih bahasa seperti JavaScript atau Python yang populer untuk backend dan frontend.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;b. Peningkatan Produktivitas&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Menguasai beberapa bahasa pemrograman memungkinkan Anda untuk memilih alat terbaik untuk pekerjaan tertentu. Setiap bahasa pemrograman memiliki library dan framework yang dikembangkan oleh komunitas yang menggunakannya. Dengan memiliki pengetahuan tentang beberapa bahasa, Anda dapat memanfaatkan kekuatan masing-masing bahasa dan ekosistemnya untuk meningkatkan produktivitas Anda. Anda dapat menggabungkan alat-alat dan bahasa yang berbeda untuk membuat solusi yang lebih efisien dan cepat.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;c. Kesempatan Karir yang Lebih Luas&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Kemampuan menjadi programmer polyglot membuka pintu kesempatan karir yang lebih luas. Banyak perusahaan mencari programmer yang dapat bekerja dengan beberapa bahasa pemrograman, terutama dalam proyek yang melibatkan teknologi yang beragam. Menjadi programmer polyglot menunjukkan fleksibilitas dan adaptabilitas Anda dalam menghadapi tantangan yang berbeda. Hal ini dapat meningkatkan daya saing Anda di pasar tenaga kerja dan memberikan Anda akses ke proyek-proyek yang menarik dan menantang.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;3. Bagaimana Memulai Perjalanan Anda menjadi Programmer Polyglot?&lt;/h3&gt;&lt;div&gt;&lt;b&gt;a. Pilih Bahasa Pemrograman Utama&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Langkah pertama untuk menjadi programmer polyglot adalah memilih satu bahasa pemrograman sebagai fokus utama Anda. Pilihlah bahasa yang paling relevan dengan minat dan tujuan karir Anda. Ini akan menjadi dasar bagi Anda untuk mempelajari bahasa-bahasa pemrograman lainnya.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;b. Eksplorasi Bahasa-Bahasa Pemrograman Lainnya&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Setelah Anda memiliki pemahaman yang kuat tentang bahasa pemrograman utama Anda, mulailah menjelajahi bahasa-bahasa pemrograman lainnya. Pelajari sintaksis, paradigma, dan konsep dasar masing-masing bahasa. Pilihlah bahasa yang berbeda dari bahasa utama Anda untuk mendapatkan perspektif yang lebih luas tentang pemrograman.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;c. Terapkan dalam Proyek Nyata&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Penting untuk menguji pengetahuan Anda dengan mengimplementasikan bahasa-bahasa pemrograman yang telah Anda pelajari dalam proyek-proyek nyata. Ini akan membantu Anda memahami kekuatan dan kelemahan masing-masing bahasa, serta meningkatkan pemahaman Anda tentang konsep pemrograman secara keseluruhan.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;d. Terus Belajar dan Beradaptasi&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Tantangan utama dalam menjadi programmer polyglot adalah menjaga kecepatan dengan perkembangan teknologi. Bahasa pemrograman baru terus muncul dan tren dapat berubah seiring waktu. Oleh karena itu, penting untuk terus belajar dan mengikuti perkembangan terbaru dalam dunia pemrograman. Teruslah beradaptasi dengan teknologi baru dan berusaha untuk menguasai bahasa-bahasa pemrograman yang relevan dengan perkembangan industri.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Kesimpulan&lt;/h3&gt;&lt;div&gt;Menjadi programmer polyglot adalah keterampilan yang sangat berharga dalam dunia pengembangan perangkat lunak yang terus berkembang. Dengan menguasai beberapa bahasa pemrograman, Anda memperluas pilihan Anda, meningkatkan produktivitas, dan membuka peluang karir yang lebih luas. Mulailah dengan memilih bahasa pemrograman utama dan eksplorasi bahasa-bahasa lainnya secara bertahap. Ingatlah untuk selalu terus belajar dan beradaptasi dengan perkembangan teknologi. Dengan dedikasi dan kerja keras, Anda bisa menjadi seorang legenda programmer polyglot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Referensi:&lt;/div&gt;&lt;div&gt;[1] &quot;Becoming a Legend: Polyglot Programmer&quot; oleh Alexander Kallaway, Medium, 13 Desember 2019, [https://levelup.gitconnected.com/becoming&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;h2 style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/3231539884821157607/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2023/07/menjadi-programmer-polyglot-menguasai.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/3231539884821157607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/3231539884821157607'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2023/07/menjadi-programmer-polyglot-menguasai.html' title='Menjadi Programmer Polyglot: Menguasai Beberapa Bahasa Pemrograman untuk Sukses yang Lebih Luar Biasa'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOnIT0ptaevWBAMVM0qnc43eZYsfWuI19TnowDN7fLKMtecNGd73FtgCyY2mhAfG8wR5qyR5jgTObnisLjGWw_ALXCV3gS5O1jdBU9oBwpMmuuJMv-RvS0LhKO4cl6-nqI4EEmyQmmdxW18wGn13qyJgTpLi3bnp4WSatLY20KxJbVX7SB1eIZjUlhxTk/s72-w400-h225-c/Red%20Modern%20Programming%20YouTube%20Thumbnail.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-918626803997890675</id><published>2023-07-09T06:23:00.009+07:00</published><updated>2025-10-18T19:49:49.191+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="ChatGPT"/><category scheme="http://www.blogger.com/atom/ns#" term="Self Improvement"/><title type='text'>Memanfaatkan GitHub Copilot dalam Pemrograman: Meningkatkan Produktivitas dengan Kecerdasan Buatan</title><content type='html'>Dalam dunia pemrograman yang terus berkembang, teknologi kecerdasan buatan (AI) telah memberikan dampak yang signifikan dalam meningkatkan produktivitas pengembang perangkat lunak. &lt;a href=&quot;http://delphigurus.blogspot.com/2023/07/meningkatkan-produktivitas-dalam.html&quot; target=&quot;_blank&quot;&gt;Pada artikel sebelumnya&lt;/a&gt; telah dibahas secara singkat beberapa tools pemrograman yang memanfaatkan AI. Salah satu alat terbaru yang menggunakan kecerdasan buatan adalah GitHub Copilot. Dalam artikel ini, kita akan menjelajahi bagaimana GitHub Copilot dapat memanfaatkan AI untuk membantu programmer dalam menulis kode, memberikan contoh penggunaan dalam beberapa bahasa pemrograman, dan memberikan arahan bagi programmer untuk memanfaatkan dengan bijaksana alat ini.&lt;br /&gt;&lt;br /&gt;

&lt;span class=&quot;fullpost&quot;&gt;
GitHub Copilot adalah sebuah extension yang dikembangkan oleh GitHub dan OpenAI. Menggunakan teknologi ChatGPT, GitHub Copilot mampu menghasilkan saran kode secara otomatis saat programmer sedang menulis kode. Alat ini menggunakan model bahasa yang dilatih dengan jutaan baris kode dari berbagai sumber untuk menghasilkan saran yang relevan dan akurat.&lt;br /&gt;&lt;br /&gt;Salah satu keunggulan utama GitHub Copilot adalah kemampuannya untuk mendukung berbagai bahasa pemrograman. Alat ini telah dilatih menggunakan berbagai bahasa pemrograman populer seperti Python, JavaScript, Java, C++, dan masih banyak lagi. Ini memungkinkan pengembang untuk mendapatkan saran kode yang spesifik sesuai dengan bahasa pemrograman yang sedang mereka gunakan.&lt;/span&gt;&lt;ol style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; counter-reset: list-number 0; display: flex; flex-direction: column; list-style: none; margin: 1.25em 0px; padding: 0px;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; counter-increment: list-number 1; display: block; margin-bottom: 0px; margin-top: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Berikut ini adalah contoh penggunaan GitHub Copilot dalam beberapa bahasa pemrograman:&lt;span class=&quot;fullpost&quot;&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji&quot; style=&quot;color: #374151;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; white-space-collapse: preserve;&quot;&gt;Python:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; line-height: 1.71429; margin-bottom: 0px; margin-top: 0px; overflow-x: auto; padding: 0px;&quot;&gt;&lt;div class=&quot;bg-black rounded-md mb-4&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(0,0,0,var(--tw-bg-opacity)); border-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin-bottom: 1rem;&quot;&gt;&lt;div class=&quot;flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-text-opacity: 1; --tw-translate-x: 0; --tw-translate-y: 0; align-items: center; background-color: rgba(52,53,65,var(--tw-bg-opacity)); border-top-left-radius: 0.375rem; border-top-right-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: rgba(217,217,227,var(--tw-text-opacity)); display: flex; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.75rem; justify-content: space-between; line-height: 1rem; padding: 0.5rem 1rem; position: relative;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;flex ml-auto gap-2&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; appearance: button; background-image: none; border-color: rgb(217, 217, 227); border-style: solid; border-width: 0px; cursor: pointer; display: flex; font-family: inherit; font-size: 12px; font-weight: inherit; gap: 0.5rem; line-height: inherit; margin: 0px 0px 0px auto; padding: 0px;&quot;&gt;&lt;svg class=&quot;h-4 w-4&quot; fill=&quot;none&quot; height=&quot;1em&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot; viewbox=&quot;0 0 24 24&quot; width=&quot;1em&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;rect height=&quot;4&quot; rx=&quot;1&quot; ry=&quot;1&quot; width=&quot;8&quot; x=&quot;8&quot; y=&quot;2&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;Copy code&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;p-4 overflow-y-auto&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; overflow-y: auto; padding: 1rem;&quot;&gt;&lt;code class=&quot;!whitespace-pre hljs language-python&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background: none; border-radius: 0.3em; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: white; font-family: inherit; font-size: inherit; font-weight: inherit; hyphens: none; line-height: 1.5; overflow-wrap: normal; padding: 0.1em; tab-size: 4; white-space: normal; word-break: normal; word-spacing: normal;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;calculate_average&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;numbers&lt;/span&gt;):
    total = &lt;span class=&quot;hljs-built_in&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #e9950c;&quot;&gt;sum&lt;/span&gt;(numbers)
    average = total / &lt;span class=&quot;hljs-built_in&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #e9950c;&quot;&gt;len&lt;/span&gt;(numbers)
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;return&lt;/span&gt; average
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; counter-reset: list-number 0; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style: none; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; counter-increment: list-number 1; display: block; margin-bottom: 0px; margin-top: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;JavaScript:&lt;/li&gt;&lt;/ol&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; line-height: 1.71429; margin-bottom: 0px; margin-top: 0px; overflow-x: auto; padding: 0px;&quot;&gt;&lt;div class=&quot;bg-black rounded-md mb-4&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(0,0,0,var(--tw-bg-opacity)); border-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin-bottom: 1rem;&quot;&gt;&lt;div class=&quot;flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-text-opacity: 1; --tw-translate-x: 0; --tw-translate-y: 0; align-items: center; background-color: rgba(52,53,65,var(--tw-bg-opacity)); border-top-left-radius: 0.375rem; border-top-right-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: rgba(217,217,227,var(--tw-text-opacity)); display: flex; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.75rem; justify-content: space-between; line-height: 1rem; padding: 0.5rem 1rem; position: relative;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;javascript&lt;/span&gt;&lt;button class=&quot;flex ml-auto gap-2&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; appearance: button; background-image: none; border-color: rgb(217, 217, 227); border-style: solid; border-width: 0px; cursor: pointer; display: flex; font-family: inherit; font-size: 12px; font-weight: inherit; gap: 0.5rem; line-height: inherit; margin: 0px 0px 0px auto; padding: 0px;&quot;&gt;&lt;svg class=&quot;h-4 w-4&quot; fill=&quot;none&quot; height=&quot;1em&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot; viewbox=&quot;0 0 24 24&quot; width=&quot;1em&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;rect height=&quot;4&quot; rx=&quot;1&quot; ry=&quot;1&quot; width=&quot;8&quot; x=&quot;8&quot; y=&quot;2&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;Copy code&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;p-4 overflow-y-auto&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; overflow-y: auto; padding: 1rem;&quot;&gt;&lt;code class=&quot;!whitespace-pre hljs language-javascript&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background: none; border-radius: 0.3em; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: white; font-family: inherit; font-size: inherit; font-weight: inherit; hyphens: none; line-height: 1.5; overflow-wrap: normal; padding: 0.1em; tab-size: 4; white-space: normal; word-break: normal; word-spacing: normal;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;capitalizeString&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;string&lt;/span&gt;) {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;return&lt;/span&gt; string.&lt;span class=&quot;hljs-title function_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;charAt&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #df3079;&quot;&gt;0&lt;/span&gt;).&lt;span class=&quot;hljs-title function_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;toUpperCase&lt;/span&gt;() + string.&lt;span class=&quot;hljs-title function_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;slice&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #df3079;&quot;&gt;1&lt;/span&gt;);
}
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; counter-reset: list-number 0; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style: none; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; counter-increment: list-number 1; display: block; margin-bottom: 0px; margin-top: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Java:&lt;/li&gt;&lt;/ol&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; line-height: 1.71429; margin-bottom: 0px; margin-top: 0px; overflow-x: auto; padding: 0px;&quot;&gt;&lt;div class=&quot;bg-black rounded-md mb-4&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(0,0,0,var(--tw-bg-opacity)); border-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin-bottom: 1rem;&quot;&gt;&lt;div class=&quot;flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-text-opacity: 1; --tw-translate-x: 0; --tw-translate-y: 0; align-items: center; background-color: rgba(52,53,65,var(--tw-bg-opacity)); border-top-left-radius: 0.375rem; border-top-right-radius: 0.375rem; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: rgba(217,217,227,var(--tw-text-opacity)); display: flex; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.75rem; justify-content: space-between; line-height: 1rem; padding: 0.5rem 1rem; position: relative;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;java&lt;/span&gt;&lt;button class=&quot;flex ml-auto gap-2&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; appearance: button; background-image: none; border-color: rgb(217, 217, 227); border-style: solid; border-width: 0px; cursor: pointer; display: flex; font-family: inherit; font-size: 12px; font-weight: inherit; gap: 0.5rem; line-height: inherit; margin: 0px 0px 0px auto; padding: 0px;&quot;&gt;&lt;svg class=&quot;h-4 w-4&quot; fill=&quot;none&quot; height=&quot;1em&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot; viewbox=&quot;0 0 24 24&quot; width=&quot;1em&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;rect height=&quot;4&quot; rx=&quot;1&quot; ry=&quot;1&quot; width=&quot;8&quot; x=&quot;8&quot; y=&quot;2&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;Copy code&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;p-4 overflow-y-auto&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; overflow-y: auto; padding: 1rem;&quot;&gt;&lt;code class=&quot;!whitespace-pre hljs language-java&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background: none; border-radius: 0.3em; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: white; font-family: inherit; font-size: inherit; font-weight: inherit; hyphens: none; line-height: 1.5; overflow-wrap: normal; padding: 0.1em; tab-size: 4; white-space: normal; word-break: normal; word-spacing: normal;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;hljs-title class_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;HelloWorld&lt;/span&gt; {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #2e95d3;&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #f22c3d;&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;hljs-params&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;(String[] args)&lt;/span&gt; {
        System.out.println(&lt;span class=&quot;hljs-string&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #00a67d;&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code class=&quot;!whitespace-pre hljs language-java&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background: none; border-radius: 0.3em; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: white; font-family: inherit; font-size: inherit; font-weight: inherit; hyphens: none; line-height: 1.5; overflow-wrap: normal; padding: 0.1em; tab-size: 4; white-space: normal; word-break: normal; word-spacing: normal;&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;Dalam penggunaan GitHub Copilot, penting bagi programmer untuk memahami bahwa alat ini hanyalah asisten. Meskipun dapat memberikan saran dan contoh kode yang baik, programmer tetap bertanggung jawab untuk memastikan kode yang dihasilkan sesuai dengan kebutuhan dan standar proyek yang sedang dikerjakan. Oleh karena itu, sangat penting untuk selalu mempelajari dan memahami kode sumber yang disarankan oleh GitHub Copilot sebelum mengimplementasikannya ke dalam proyek.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adapun arahan bagi programmer yang menggunakan GitHub Copilot:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pelajari dan Pahami Kode Sumber:&lt;/b&gt; Meskipun GitHub Copilot dapat memberikan kode yang lengkap, penting bagi programmer untuk memahami kode tersebut. Lakukan analisis dan verifikasi kode yang disarankan untuk memastikan kecocokan dengan kebutuhan proyek dan praktik pemrograman terbaik.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gunakan dengan Bijaksana: &lt;/b&gt;Meskipun GitHub Copilot dapat mempercepat proses penulisan kode, ingatlah bahwa alat ini hanya memberikan saran dan tidak selalu menghasilkan solusi yang sempurna. Gunakan kebijaksanaan dalam memilih dan menerapkan saran yang diberikan oleh GitHub Copilot.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Teruslah Belajar: &lt;/b&gt;Teknologi pemrograman terus berkembang, dan GitHub Copilot merupakan salah satu contohnya. Jangan bergantung sepenuhnya pada alat ini, tetapi tetaplah belajar dan mengasah keterampilan pemrograman Anda. Perluas pengetahuan Anda tentang bahasa pemrograman, paradigma pemrograman, dan praktik terbaik dalam industri.&lt;br /&gt;&lt;br /&gt;Dalam kesimpulannya, penggunaan GitHub Copilot dapat memberikan manfaat yang signifikan dalam meningkatkan produktivitas dan efisiensi programmer dalam menulis kode. Dengan kemampuan AI yang cerdas, alat ini dapat memberikan saran kode yang relevan dalam berbagai bahasa pemrograman. Namun, penting bagi programmer untuk tetap mempelajari dan memahami kode yang disarankan, serta menggunakan GitHub Copilot dengan bijaksana. Dengan kombinasi keahlian manusia dan kecerdasan buatan, programmer dapat memanfaatkan GitHub Copilot sebagai asisten yang berharga dalam pengembangan perangkat lunak.

&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/918626803997890675/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2023/07/memanfaatkan-github-copilot-dalam_9.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/918626803997890675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/918626803997890675'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2023/07/memanfaatkan-github-copilot-dalam_9.html' title='Memanfaatkan GitHub Copilot dalam Pemrograman: Meningkatkan Produktivitas dengan Kecerdasan Buatan'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-8480524872568318248</id><published>2023-07-09T05:44:00.023+07:00</published><updated>2025-10-18T19:50:05.447+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="ChatGPT"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips Dan Trick"/><title type='text'>Meningkatkan Produktivitas dalam Pengembangan Perangkat Lunak dengan ChatGPT</title><content type='html'>Dalam dunia pemrograman, terus berkembangnya teknologi membawa kemudahan dan efisiensi dalam proses pengembangan perangkat lunak. Salah satu kemajuan terbaru adalah penggunaan ChatGPT dalam bentuk library dan framework yang dapat membantu kerja programmer. Artikel ini akan membahas beberapa contoh library dan framework yang memanfaatkan ChatGPT dan bagaimana penggunaannya dapat meningkatkan produktivitas dalam pengembangan perangkat lunak.&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;
OpenAI 
API&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&amp;nbsp;OpenAI menyediakan API yang memungkinkan pengembang untuk mengakses model bahasa GPT-3, termasuk ChatGPT. Dengan menggunakan API ini, programmer dapat memanfaatkan kemampuan ChatGPT untuk memberikan saran dan solusi kode secara otomatis dalam aplikasi mereka. Hal ini dapat menghemat waktu dan usaha dalam mencari solusi kode, mempercepat proses pengembangan, dan meningkatkan efisiensi kerja.
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;http://delphigurus.blogspot.com/2023/07/memanfaatkan-github-copilot-dalam_9.html&quot; target=&quot;_blank&quot;&gt;GitHub Copilot&amp;nbsp;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&amp;nbsp;GitHub Copilot adalah sebuah extension yang dikembangkan oleh GitHub dan OpenAI. Menggunakan teknologi ChatGPT, extension ini dapat menghasilkan saran kode secara otomatis saat programmer sedang menulis kode. GitHub Copilot dapat memberikan kode lengkap, mengisi celah kode, dan mengusulkan solusi untuk berbagai masalah pemrograman. Hal ini memungkinkan programmer untuk lebih fokus pada pemecahan masalah dan mengurangi waktu yang dihabiskan untuk menulis kode rutin.

&lt;br /&gt;&lt;br /&gt;&lt;b&gt;
Kite&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&amp;nbsp;Kite adalah sebuah plugin untuk editor kode yang memanfaatkan teknologi pembelajaran mesin, termasuk ChatGPT. Plugin ini menyediakan fitur-fitur seperti autocompletion, dokumentasi, dan saran kode yang cerdas berdasarkan konteks kode yang sedang ditulis. Kite membantu programmer dalam menulis kode dengan lebih cepat dan akurat, serta memberikan saran yang relevan untuk meningkatkan kualitas kode.

&lt;br /&gt;&lt;br /&gt;&lt;b&gt;
Tabnine&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&amp;nbsp;Tabnine adalah sebuah plugin kecerdasan buatan (AI) yang memanfaatkan model bahasa berbasis transformer, termasuk ChatGPT. Plugin ini memberikan saran kode secara real-time berdasarkan konteks kode yang ditulis oleh programmer. Dengan kemampuan autocomplete yang cerdas, Tabnine membantu meningkatkan efisiensi penulisan kode, mengurangi kesalahan, dan mempercepat proses pengembangan.

&lt;br /&gt;&lt;br /&gt;&lt;b&gt;
DeepCode&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&amp;nbsp;DeepCode adalah sebuah platform analisis kode yang menggunakan teknologi pembelajaran mesin, termasuk ChatGPT, untuk mendeteksi bug dan memberikan saran perbaikan pada kode. Platform ini membantu pengembang dalam meningkatkan kualitas dan keamanan kode mereka. Dengan mendapatkan saran dan analisis dari DeepCode, programmer dapat mengidentifikasi potensi masalah dalam kode mereka dan mengambil langkah-langkah perbaikan yang diperlukan.

&lt;br /&gt;&lt;br /&gt;&lt;b&gt;
CodeGuru&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&amp;nbsp;CodeGuru adalah sebuah layanan dari AWS yang memanfaatkan teknologi machine learning, termasuk ChatGPT, untuk memberikan saran dan analisis kode. Layanan ini membantu pengembang dalam mengidentifikasi bug, memperbaiki kinerja, dan meningkatkan praktik pemrograman terbaik. Dengan bantuan CodeGuru, programmer dapat mengoptimalkan kode mereka untuk kinerja yang lebih baik dan meningkatkan kualitas aplikasi.

  &lt;br /&gt;&lt;br /&gt;
Memanfaatkan library dan framework yang memanfaatkan ChatGPT, seperti yang disebutkan di atas, dapat memberikan banyak manfaat dalam pengembangan perangkat lunak. Dengan saran, solusi, dan analisis yang cerdas, programmer dapat meningkatkan produktivitas, menghemat waktu, dan meningkatkan kualitas kode mereka. Penggunaan teknologi ini juga membuka peluang untuk eksplorasi lebih lanjut dalam pengembangan alat dan metode baru yang dapat mempercepat proses pengembangan perangkat lunak di masa depan.

&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/8480524872568318248/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2023/07/meningkatkan-produktivitas-dalam.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8480524872568318248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8480524872568318248'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2023/07/meningkatkan-produktivitas-dalam.html' title='Meningkatkan Produktivitas dalam Pengembangan Perangkat Lunak dengan ChatGPT'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-1114952891731635409</id><published>2023-07-09T05:37:00.011+07:00</published><updated>2025-10-19T05:18:49.015+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artikel"/><category scheme="http://www.blogger.com/atom/ns#" term="ChatGPT"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips Dan Trick"/><title type='text'>Menggunakan ChatGPT untuk Menulis Kode</title><content type='html'>ChatGPT, sebuah model bahasa yang dikembangkan oleh OpenAI, telah menjadi alat yang berguna bagi pengembang perangkat lunak untuk menulis kode. Dalam artikel ini, kita akan melihat beberapa cara untuk menggunakan ChatGPT dalam proses pengembangan perangkat lunak. &lt;br /&gt;&lt;br /&gt;

&lt;span class=&quot;fullpost&quot;&gt;
Salah satu cara penggunaan ChatGPT adalah sebagai asisten yang membantu dalam menyelesaikan kode. Dalam pengembangan perangkat lunak, seringkali kita menghadapi masalah atau tantangan yang memerlukan solusi kode tertentu. Dengan menggunakan ChatGPT, kita dapat mengajukan pertanyaan atau menggambarkan masalah yang kita hadapi, dan model bahasa ini dapat memberikan saran atau bahkan menuliskan potongan kode yang relevan. Ini dapat membantu menghemat waktu dan usaha dalam mencari solusi.&lt;br /&gt;&lt;br /&gt;Selain itu, ChatGPT juga dapat digunakan untuk membantu menjelaskan atau mengkomunikasikan konsep pemrograman kepada orang lain. Misalnya, jika kita perlu menjelaskan logika atau algoritma tertentu kepada kolega yang tidak begitu akrab dengan bahasa pemrograman yang digunakan, kita dapat menggunakan ChatGPT untuk memformulasikan penjelasan yang lebih mudah dipahami. Model ini dapat memecah konsep yang kompleks menjadi bahasa yang lebih sederhana dan terstruktur.&lt;br /&gt;&lt;br /&gt;Namun, saat menggunakan ChatGPT dalam pengembangan perangkat lunak, ada beberapa hal yang perlu diperhatikan. Pertama, model ini merupakan model bahasa yang dilatih berdasarkan data sejarah, dan tidak memiliki pemahaman tentang spesifikasiperangkat lunak atau pemrograman yang mendalam. Oleh karena itu, penting untuk memverifikasi dan menguji ulang kode yang dihasilkan oleh ChatGPT sebelum diimplementasikan secara langsung ke dalam proyek.&lt;br /&gt;&lt;br /&gt;Selain itu, penting juga untuk memahami bahwa ChatGPT hanya merupakan alat bantu, dan bukan pengganti bagi pengembang perangkat lunak. Model ini dapat memberikan saran dan membantu dalam menulis kode, tetapi tetap diperlukan keahlian dan penilaian manusia dalam mengambil keputusan akhir terkait dengan implementasi dan kualitas kode.&lt;br /&gt;&lt;br /&gt;Dalam penggunaan ChatGPT, terus terang ada beberapa kendala dan batasan yang perlu diingat. Model ini mungkin tidak selalu menghasilkan solusi yang sempurna atau benar. Terkadang, jawaban atau kode yang dihasilkan mungkin tidak sesuai dengan harapan atau tidak optimal. Oleh karena itu, penting untuk tetap kritis dan menggunakan kebijaksanaan dalam mengambil keputusan terkait kode yang dihasilkan oleh ChatGPT.&lt;br /&gt;&lt;br /&gt;Dalam kesimpulannya, penggunaan ChatGPT dalam pengembangan perangkat lunak dapat menjadi alat yang berguna dalam membantu menulis kode, memberikan saran, dan menjelaskan konsep pemrograman. Namun, perlu diingat bahwa model ini tidak sempurna dan memerlukan kebijaksanaan manusia. Dengan memahami batasannya, pengembang perangkat lunak dapat memanfaatkan potensi ChatGPT untuk meningkatkan produktivitas dan efisiensi dalam pekerjaan mereka.
  &lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/1114952891731635409/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2023/07/menggunakan-chatgpt-untuk-menulis-kode.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1114952891731635409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/1114952891731635409'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2023/07/menggunakan-chatgpt-untuk-menulis-kode.html' title='Menggunakan ChatGPT untuk Menulis Kode'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-4952925842624310343</id><published>2023-07-09T05:21:00.005+07:00</published><updated>2023-07-09T05:47:42.256+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Self Improvement"/><title type='text'>Tanda-tanda programmer buruk</title><content type='html'>Dalam dunia pekerjaan, ada berbagai cara untuk menjadi tidak efektif. Berikut adalah beberapa perilaku yang sering terjadi pada beberapa programmer yang pernah saya kerjakan selama bertahun-tahun:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&quot;Saya Seorang Insinyur Perangkat Lunak, Bukan Programmer&quot;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Anda tahu seperti apa mereka. Mereka membawa keyboard mekanis ke kantor? Mereka tidak bisa ikut dalam pertemuan harian karena terlalu sibuk memikirkan masalah tersebut (hanya butuh 5 menit untuk menyampaikan apa yang Anda pikirkan). Berapa lama waktu yang dibutuhkan untuk mendapatkan latte?
&lt;span class=&quot;fullpost&quot;&gt;


&lt;br /&gt;&lt;br /&gt;Saya tidak begitu yakin bagaimana seseorang bisa menjadi begitu sombong dengan pengalaman 3 tahun, tapi begitulah adanya.&lt;br /&gt;&lt;br /&gt;Saya suka mengesankan orang dengan gelar pekerjaan saya. Siapa? Apa maksud Anda, tidak ada yang peduli.&lt;br /&gt;&lt;br /&gt;Mungkin sebaiknya Anda menghabiskan lebih banyak waktu untuk bekerja dan sedikit waktu untuk memikirkan status Anda?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;Papan Tulis di Belakang&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Beberapa orang di industri ini memiliki gelar. Saya pernah bekerja dengan orang-orang yang memiliki gelar doktor (bukan yang berhubungan dengan kedokteran, OK). Mereka yang memiliki kualifikasi di industri sering memilih untuk tidak menyebutkannya, karena dalam banyak organisasi terdapat sikap meremehkan terhadap pendidikan.&lt;br /&gt;&lt;br /&gt;Namun, ada juga yang menggunakan kacamata tanpa alasan medis (ini benar-benar terjadi) dan berdiri di depan papan tulis saat panggilan video.&lt;br /&gt;&lt;br /&gt;Saya akan lebih terkesan jika papan tulis Anda berisi lebih dari sekadar daftar poin. Artinya, saya tahu Anda tidak memahami arsitektur aplikasi secara keseluruhan. Papan tulis Anda seperti memberi make-up pada babi.&lt;br /&gt;&lt;br /&gt;Eits.&lt;br /&gt;&lt;br /&gt;Namun, ada juga yang menuliskan informasi menarik di papan tulis tersebut.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;Menghapus Proyek Saat Ini&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Anda bergabung dalam proyek baru dan melihat seseorang di Twitter merekomendasikan untuk menghapus semuanya dan memulai dari awal.&lt;br /&gt;&lt;br /&gt;Apakah anggota tim saat ini tidak merasa keberatan dengan saran ini? Apa maksud Anda, kerjasama tim bisa terganggu?&lt;br /&gt;&lt;br /&gt;Hanya hapus saja.&lt;br /&gt;&lt;br /&gt;Oke, terserah.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;Michael Jackson (Hitam atau Putih)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Seorang programmer hanya dapat berpikir dalam konsep benar dan salah daripada dalam nuansa abu-abu. Hampir dalam setiap situasi, tidak ada keputusan yang benar-salah, melainkan hanya beragam nuansa abu-abu. Kecuali dalam beberapa hal. Jadi, jangan sampai bingung. Ketika seorang programmer menyatakan bahwa sesuatu seharusnya &quot;hanya&quot; dilakukan dengan cara tertentu, mereka seringkali berpikir tentang &quot;cara mereka&quot; melakukan sesuatu.&lt;br /&gt;&lt;br /&gt;Terkadang tidak perlu dilakukan dengan caranya, atau tidak dilakukan sama sekali.&lt;br /&gt;&lt;br /&gt;Mungkin perlu memperkenalkan pemikiran &quot;itu tergantung&quot; dalam praktik pengembangan perangkat lunak Anda.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;Prinsip Peter, Jalan Menurun yang Lebih Cepat&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Beberapa programmer memang pantas mendapatkan promosi setelah 12 atau bahkan 6 bulan. Namun, banyak programmer merasa berhak mendapatkan kenaikan gaji dan gelar pekerjaan baru setelah beberapa bulan bekerja. Standar kepemimpinan tim di perusahaan teknologi memang terlihat sangat rendah. Pengembang baru dengan cepat naik pangkat tanpa pengetahuan teknis yang memadai untuk posisi baru yang lebih tinggi, dan tentu saja kurang memiliki pengetahuan tentang orang untuk menjadi seorang pemimpin tim yang efektif.&lt;br /&gt;&lt;br /&gt;Pemrograman melibatkan manusia. Itu butuh waktu untuk berkembang.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;b&gt;Copy-Pasta&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Hanya menyalin kode dari Stack Overflow. Sepertinya berhasil! Ayo lakukan.&lt;br /&gt;&lt;br /&gt;Beberapa hari kemudian:&lt;br /&gt;&lt;br /&gt;Bisakah Anda memperbaiki error ini?&lt;br /&gt;&lt;br /&gt;Tebak saja. Perbaikan tidak segera datang.Kurangnya Rasa Ingin Tahu Tidak apa-apa jika Anda bekerja demi uang. Sampai batas tertentu, setiap pekerjaan adalah tentang penghasilan yang Anda dapatkan darinya. Namun, jika Anda benar-benar memiliki gairah dan mencintai pekerjaan Anda, itu berarti Anda bisa mendapatkan lebih banyak dari pekerjaan tersebut dan menjadi kolega yang lebih berharga.&lt;br /&gt;&lt;br /&gt;Anda ingin pensiun di usia 40? Tidak begitu banyak. Mungkin itulah mengapa Anda tidak begitu tertarik untuk mencari tahu asal-usul bug tersebut setelah semua.&lt;br /&gt;&lt;br /&gt;Tapi mengapa?&lt;br /&gt;&lt;br /&gt;Jika Anda tidak menikmati pekerjaan Anda dan ingin meningkatkan diri dan proyek saat ini, mungkin sudah saatnya untuk mencari karier baru.&lt;br /&gt;&lt;br /&gt;Artikel ini merupakan tinjauan yang santai tentang perilaku merusak berikut ini:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;Saya Seorang Insinyur Perangkat Lunak, Bukan Programmer&quot;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Mereka yang fokus pada status, bukan menyelesaikan pekerjaan.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Papan Tulis di Belakang&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Mereka yang berusaha memamerkan kredensial mereka kepada programmer lain.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Menghapus Proyek Saat Ini&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Mereka yang ingin menyalahkan orang lain atas situasi saat ini.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Michael Jackson (Hitam atau Putih)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Mereka yang tidak berpikir dalam konsep klasik &quot;tergantung pada situasi&quot;, dan malah berpikir dalam istilah biner hanya untuk situasi kompleks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prinsip Peter, Jalan Menurun yang Lebih Cepat&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Mereka yang mendapatkan manfaat dari Prinsip Peter, dipromosikan dari peran mereka saat ini tanpa mendapatkan kompetensi yang diperlukan.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Copy-Paste&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Menyalin kode dari Stack Overflow tanpa memahaminya dapat menghasilkan kode produksi yang bermasalah dan sulit dipahami.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Kurangnya Rasa Ingin Tahu&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;Mereka yang tidak ingin tahu lebih dari yang mereka ketahui saat ini, tidak maju dalam pengetahuan mereka, dan akibatnya, tidak memajukan proyek.

&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;div&gt;&lt;b&gt;Kesimpulan&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Jika Anda menampilkan salah satu dari tanda-tanda ini, itu tidak berarti Anda adalah programmer yang buruk. Menampilkan semua 7? Anda mungkin bukan pengembang fantastis seperti yang Anda pikirkan.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Diterjemahkan secara bebas dari :&lt;/div&gt;&lt;div&gt;https://medium.com/@tsecretdeveloper/the-7-signs-of-a-bad-programmer-a624204f7222&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/4952925842624310343/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2023/07/tanda-tanda-programmer-buruk.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/4952925842624310343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/4952925842624310343'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2023/07/tanda-tanda-programmer-buruk.html' title='Tanda-tanda programmer buruk'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-4981317369142592375</id><published>2012-11-13T12:56:00.000+07:00</published><updated>2012-11-14T07:30:55.406+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OOP"/><title type='text'>Apa sebenarnya yang dimaksud sender pada event handler</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;Event Handlers Dan Sender&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan potongan kode event handler event OnClick event pada sebuah button (bernama &quot;Button1&quot;):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;procedure TForm1.Button1Click(Sender: TObject) ;
begin
...
end; 
&lt;/pre&gt;&lt;br /&gt;
Method&amp;nbsp;Button1Click &amp;nbsp;mempunyai parameter yang bertipe &amp;nbsp;TObject yang disebut Sender. Setiap event handler, pada Delphi, minimal akan memiliki &amp;nbsp;sebuah parameter bernama Sender. Ketika button di-click , event handler (Button1Click) untuk event OnClick dipanggil.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;
Parameter &quot;Sender&quot; mengacu pada sebuah komponen yang dipakai untuk memanggil method tersebut.Jika anda meng-click Button1, maka akan menyebabkan method Button1Click dipanggil, sebuah referensi atau pointer yang mengacu pada Button1 akan dikirim ke &amp;nbsp;Button1Click pada bagian parameter yang disebut Sender.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Perhatikan Kode Berikut&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Parameter Sender , jika digunakan dengan benar, maka akan memberikan fleksibilatas yang luar biasa pada kode kita. Dengan parameter sender ini kita bisa mengetahui komponen apa yang memicu terksekusinya suatu event. Hal ini memudahkan kita untuk menggunakan &amp;nbsp;event handler yang sama untuk dua komponen yang berbeda.&lt;br /&gt;
&lt;br /&gt;
Sebagai contoh, misal kita menginginkan sebuah button dan menuitem melakukan satu task yang sama. Akan aneh jika kita harus menuliskan kode yang sama persis untuk button dan menuitem tersebut.&lt;br /&gt;
&lt;br /&gt;
Agar button dan menuitem tersebut bisa menggunakan &amp;nbsp;event handler yang sama, ikut langkah-langkah di bawah ini :&lt;br /&gt;
&lt;br /&gt;
- Tulis &amp;nbsp;event handler untuk komponen pertama (mis &amp;nbsp;button )&lt;br /&gt;
-&amp;nbsp;Pilih komponen kedua (mis MenuItem1)&lt;br /&gt;
- Beralih ke tab &amp;nbsp;Event pada Object Inspector (F11).&lt;br /&gt;
- Klik panah ke bawah untuk mengambil event yang pernah ditulis. (Delphi akan memberikan daftar event yang kompatible untuk kedua komponen terpilih)&lt;br /&gt;
- Pilih event dari &amp;nbsp;drop-down list. (mis Button1Click)&lt;br /&gt;
&lt;br /&gt;
Apa yang kita lakukan di atas adalah membuat sebuah method event-handler yang menangani event OnClick dari komponen &amp;nbsp;button dan menu item sekaligus. Sekarang, yang harus kita lakukan di event handler yang dipakai beberapa komponen (button dan menuitem) adalah membedakan komponen mana yang memicu tereksekusinya method ini. Sebagai contoh, kita mempunyai kode seperti bawah ini :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;procedure TForm1.Button1Click(Sender: TObject) ;
begin
  {code for both a button and a menu item}
  ...
  {some specific code:}
  if Sender = Button1 then
    ShowMessage(&#39;Button1 clicked!&#39;)
  else if Sender = MenuItem1 then
    ShowMessage(&#39;MenuItem1 clicked!&#39;)
  else
    ShowMessage(&#39;??? clicked!&#39;) ;
end; 
&lt;/pre&gt;Perhatikan, pada bagian else in the if-then-else yang kedua menangani situasi dimana sendernya &amp;lt;&amp;gt; button1 maupun menuitem1. Hal ini akan kelihatan hasilnya dengan kode berikut :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;procedure TForm1.Button2Click(Sender: TObject) ;
begin
  Button1Click(Button2) ;
  {this will result in: &#39;??? clicked!&#39;}
end; 
&lt;/pre&gt;&lt;b&gt; IS and AS&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Karena &amp;nbsp;Sender bertipe TObject, semua &amp;nbsp;object bisa dijadikan Sender. Nilai Sender selalu sebuah komponen yang merespon event. Kita bisa melakukan pengecekan unntuk mencari tipe dari sender dengan menggunakan &lt;i&gt;reserved word&lt;/i&gt; &quot;&lt;b&gt;is&lt;/b&gt;&quot;. &amp;nbsp;Perhatikan contoh di bawah ini !&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;if Sender is TButton then
  DoSomething
else
  DoSomethingElse; 
&lt;/pre&gt;Untuk mengetahui penggunaan &quot;is&quot; dan &quot;as&quot; , tambahkan sebuah Edit box pada form (berinama Edit1) dan tulis kode berikut ini pada &amp;nbsp;event handler&amp;nbsp;OnExit :&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;procedure TForm1.Edit1Exit(Sender: TObject) ;
begin
  Button1Click(Edit1) ;
end; 
&lt;/pre&gt;Sekarang ubah &amp;nbsp;ShowMessage(&#39;??? clicked!&#39;) ; pada&amp;nbsp;event handler&amp;nbsp;Button1 OnClick &amp;nbsp;menjadi:&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;{... else}
begin
  if Sender is TButton then
    ShowMessage(&#39;Some other button triggered this event!&#39;)
  else if Sender is TEdit then
    with Sender as TEdit do
    begin
      Text := &#39;Edit1Exit has happened&#39;;
      Width := Width * 2;
      Height := Height * 2;
    end {begin with}
  end;
end;&lt;/pre&gt;&lt;br /&gt;
Ok, sekarang kita lihat hasilnya: Jika kita klik pada &amp;nbsp;Button1 makan pesan &#39;Button1 clicked!&#39; akan muncul, kita klik MenuItem1 maka &#39;MenuItem1 clicked!&#39; akan mencul. Jika &amp;nbsp;kita klik pada &amp;nbsp;Buton2 maka pesan &#39;Some other button triggered this event!&#39; akan muncul, namun jika kita klik &amp;nbsp;Edit1 kemudia klik komponen lan (agar event OnExit terpicu), apa yang akan terjadi?&lt;br /&gt;
&lt;b&gt; Kesimpulan&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Seperti yang kita lihat tadi, parameter Sender bisa sangat bermanfaat jika digunakan dengan benar&lt;br /&gt;
Diterjemahkan dengan sangat bebas dari :&amp;nbsp;&lt;a href=&quot;http://delphi.about.com/od/objectpascalide/a/sender.htm&quot;&gt;http://delphi.about.com/od/objectpascalide/a/sender.htm&lt;/a&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/4981317369142592375/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2012/11/apa-sebenarnya-yang-dimaksud-sende-pada.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/4981317369142592375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/4981317369142592375'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2012/11/apa-sebenarnya-yang-dimaksud-sende-pada.html' title='Apa sebenarnya yang dimaksud sender pada event handler'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-8154925507637795920</id><published>2012-10-31T12:41:00.001+07:00</published><updated>2012-10-31T12:45:34.463+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="OOP"/><title type='text'>Singleton Pattern</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;Motivasi&lt;/b&gt;&lt;br /&gt;
Kadang ada keadaan di mana kita hanya boleh memiliki satu instan dari suatu kelas. Sebagai contoh,  kita hanya boleh memiliki satu window manager (atau satu sistem file atau satu spooler printer) pada satu aplikasi. Biasanya singleton digunakan untuk managemen sumber daya internal maupun eksternal secara terpusat dan bisa diakses dimanapun. &lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;fullpost&quot;&gt;  &lt;br /&gt;
Singleton merupkan salah satu design pattern yang paling sederhana. Singleton hanya melibatkan satu kelas yang bertanggung jawab untuk menginstansiasi dirinya sendiri dan pada saat yang bersamaan menyediakan akses secara global terhadap instan tersebut. Pada pattern singleton, instan bisa diakses dari manapun tanpa harus memanggil contructor dari kelas instan tersebut&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tujuan&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
• Memastikan bahwa satu kelas hanya bisa dibuat instannya sekali.&lt;br /&gt;
• Menyediakan akses secara global terhadap instan singleton tersebut.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Implementasi&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pada bahasa pemrograman Java, implementasi dari singleton adalah dengan membuat sebuah atribut static pada kelas  &quot;Singleton&quot; , constructor dengan akses private, dan sebuah method static dengan akses public yang mengembalikan nilai yang mengacu pada atribut static.&lt;br /&gt;
&lt;br /&gt;
Pattern Singleton mendefinisikan sebuah operasi yang bernama getInstance. Getinstance ini bertugas mengembalikan instan yang unik yang diakses oleh klien. GetInstance() adalah sebuah method yang bertanggung jawab untuk menciptakan sebuah instant dari kelas itu sendiri jika instan tersebut belum diciptakan. Jika sudah, method getinstant tinggal mengembalikan instan tersebut.&lt;br /&gt;
&lt;br /&gt;
Sedangkan implementasi pada Delphi sedikit berbeda. Hal ini karena beberapa hal : &lt;br /&gt;
1. Pada Delphi versi lama, static field tidak didukung&lt;br /&gt;
2. AFAIK, Delphi tidak mengijinkan private constructor.&lt;br /&gt;
&lt;br /&gt;
Untuk mengakali kekurangan tersebut, implementasi Singleton pada Delphi bisa dilakukan seperti di bawah ini :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;unit Singletn;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type

  TOSingleton = class(TObject)
  public
    constructor Create;
    destructor Destroy; override;
  end;

var

  Global_OSingleton: TOSingleton;

constructor TOSingleton.Create;
begin
  if Global_OSingleton &lt;&gt; nil then
    {NB could show a message or raise a different exception here}
    Abort
  else
    Global_OSingleton := Self;
end;

destructor TOSingleton.Destroy;
begin
  if Global_OSingleton = Self then
    Global_OSingleton := nil;
  
  inherited Destroy;
end;

procedure FreeGlobalObjects; far;
begin  
  if Global_OSingleton &lt;&gt; nil then
    Global_OSingleton.Free;
end;

&lt;/pre&gt;Coba anda perhatikan baris kode pada contructor. Disitu tertulis, jika variable &lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;Global_OSingleton &lt;&gt; nil
&lt;/pre&gt;maka method Abort akan dieksekusi, atau bisa juga diganti dengan melemparkan eksepsi. Jika &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-delphi&quot;&gt;Global_OSingleton  = nil
&lt;/pre&gt;maka akan dicreate sebuah instan dari kelas TOSingleton. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Penerapan Contoh&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Sesuai dengan definisi, pattern singleton digunakan ketika dibutuhkan hanya ada satu instan dari suatu kelas, dan ketika instan tersebut harus bisa diakses dari manapun. Berikut ini contoh real dimana pattern singleton diterapkan :&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contoh 1 – Kelas Log&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pattern  singleton digunakan untuk kelas  log. Kelas ini biasanya diimplementasikan sebagai sebuah singleton, dan menyediakan akses secara global dari manapun tanpa harus mengistansiasi kelas tersebut tiap kali melakukan operasi log. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contoh 2 –Kelas Konfigurasi&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pattern singleton digunakan untuk kelas yang mengatur kofigurasi sebuah aplikasi. Dengan mengimplementasi kelas konfigurasi sebagai singleton, bukan hanya menyediakan akses global , tapi juga menjadikan instan dari kelas konfigurasi tersebut sebagai cache objek. Ketika kelas konfigurasi dinstansiasi, singleton akan menyimpan data konfigurasi tersebut sesuai struktur kelas tersebut. Jika data konfigurasi diambil dari database atau file, singleton memungkinkan kita bisa mengakses data tersebut tanpa melakukan pengambilan ulang dari database atau file tiap kali kita membutuhkan. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contoh3 - Dipakai Untuk Mengakses sumberdaya yang dipakai bersama &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Singleton bisa digunakan pada aplikasi yang membutuhkan akses ke &lt;i&gt;port &lt;/i&gt;serial. Misal,  ada banyak kelas dalam aplikasi, berada pada lingkungan &lt;i&gt;multithreading &lt;/i&gt;, yang harus mengerjakan sesuatu pada &lt;i&gt;port &lt;/i&gt;serial.Pada kasus ini  singleton dengan method harus digunakan untuk mengatur semua operasi pada &lt;i&gt;port &lt;/i&gt;serial tersebut.&lt;br /&gt;
&lt;br /&gt;
Demikianlah sekilas tentang pattern singleton. Semoga bermanfaat dan tetap semangat !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/8154925507637795920/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2012/10/singleton-pattern.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8154925507637795920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/8154925507637795920'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2012/10/singleton-pattern.html' title='Singleton Pattern'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-6966057432951140219</id><published>2012-08-31T16:38:00.000+07:00</published><updated>2012-08-31T16:38:00.698+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lain-lain"/><title type='text'>Mari Bergabung Milis IT</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Programmer dituntut untuk selalu mengikuti perkembangan Teknologi Infomasi (TI). Pada masa sekarang ini, perubahan TI bukan hanya terjadi pada setiap minggu atau bulan. Setiap hari selalu ada perubahan, bahkan bisa jadi setiap jam selalu ada perubahan TI. Salah satu cara agar selalu bisa mengikuti mengikuti perkembangan adalah dengan bergabung dengan &lt;em&gt;mailing list&lt;/em&gt; (milis) TI. Saya, sejak bayi orok (baca : sejak awal mengenal pemrograman) selalu berkutat dengan pascal/delphi. Tidak aneh jika saya bergabung dengan milis &lt;a href=&quot;http://tech.groups.yahoo.com/group/Delphindo/&quot;&gt;delphido&lt;/a&gt; (delphi indonesia). &lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
Selain milis delphindo, saya juga bergabung dengan milis IT lainnya. Pada sebagian besar milis yang saya ikuti, saya banyak menjadi pasive member. Lalu apa untung nya kalau hanya menjadi pasive member? Tetap ada untungnya. Dengan bergabung dengan milis tadi, setidaknya kita bisa tahu topik apa yang lagi hangat di milis tersebut. Selalin itu, kita juga bisa mengetahui teknologi , framework, atau bahkan kita bisa mendapatkan pekerjaan dari milist tersebut : ). Berikut ini milis yang saya ikuti : &lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;width: 519px;&quot;&gt;&lt;tbody&gt;
&lt;tr bgcolor=&quot;#CCCCCC&quot;&gt;     &lt;td width=&quot;82&quot;&gt;&lt;div align=&quot;center&quot;&gt;&lt;strong&gt;Nama&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width=&quot;417&quot;&gt;&lt;div align=&quot;center&quot;&gt;&lt;strong&gt;Keterangan&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;https://groups.google.com/forum/#!forum/liferay-id&quot;&gt;Liferay User Group Indonesia &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;liferay User Group Indonesia, Jakarta &lt;/td&gt;   &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;https://groups.google.com/forum/#!forum/it-project-indonesia&quot;&gt;Manajemen Proyek IT &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Diskusi tentang berbagai aspek manajemen proyek IT seperti estimasi biaya, manajemen resource, resiko, planning, tracking, dsb. Sharing tentang metodologi, tips dan trik, contoh dokumen, dll. &lt;/td&gt;   &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;https://groups.google.com/forum/#!forum/pentaho-id&quot;&gt;Pentaho User Group Indonesia &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Pentaho User Group ini merupakan tempat diskusi mengenai pemanfaatan dan pengembangan Pentaho - kumpulan aplikasi Business Intelligence (BI) Open Source. Info lebih lanjut mengenai Pentaho dapat dilihat di : - http://pentaho.phi-integration.com &lt;/td&gt;   &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;https://groups.google.com/forum/#!forum/scrum-indonesia&quot;&gt;Scrum Indonesia &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Discussion group to talk about Scrum and Agile in Bahasa Indonesia but not limited to other process that complement with Scrum like XP and Lean. &lt;/td&gt;   &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;https://groups.google.com/forum/#!forum/id-android-dev&quot;&gt;[id-android-Dev] Indonesian Android Developers &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Milis Indonesian Android Developers bagian dari milis ID-Android http://groups.google.com/group/id-android/ dan http://android.or.id mari bergabung/join bersama Forum ID-Android http://forum.android.or.id &lt;/td&gt;     &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;http://groups.yahoo.com/group/codeigniter-id/?yguid=229690520&quot;&gt;codeigniter-id &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Milis CodeIgniter Indonesia &lt;/td&gt;     &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;http://groups.yahoo.com/group/id-python/?yguid=229690520&quot;&gt;id-python &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Milis Python Indonesia &lt;/td&gt;     &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;http://groups.yahoo.com/group/jug-indonesia/?yguid=229690520&quot;&gt;jug-indonesia &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Selain membahas Java, milis ini juga membahas framework-framework dan tools populer di dunia Java seperti JBoss Seam, Spring, Hibernate, dsb. JUG memiliki pertemuan bulanan yang dinamakan JaMU (Java Meet Up) dimana di pertemuan ini para member bertemu di darat serta membahas topik-topik yang sedang hangat di Java dengan Pembicara yang pakar pada topik tersebut. Untuk mengetahui jadwal dan lokasi tempat pertemuan JUG, bergabunglah bersama kami sekarang dan jadi bagian dari &lt;/td&gt;     &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;http://groups.yahoo.com/group/phpug/?yguid=229690520&quot;&gt;phpug &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;Kelompok Pengguna PHP Indonesia (PHPUG) dibuat untuk bertukar ilmu dan pengalaman antar para pemakai PHP di Indonesia. &lt;/td&gt;     &lt;/tr&gt;
&lt;tr align=&quot;left&quot; valign=&quot;top&quot;&gt;     &lt;td&gt;&lt;a href=&quot;http://groups.yahoo.com/group/sqlserver-indo/?yguid=229690520&quot;&gt;sqlserver-indo &lt;/a&gt; &lt;/td&gt;     &lt;td&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td&gt;Diskusi dan tukar informasi seputar database Microsoft SQL Server. Topik-topik meliputi: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Design / perancangan database &lt;br /&gt;
&lt;br /&gt;
Instalasi-Konfigurasi &lt;br /&gt;
&lt;br /&gt;
Administrasi Database &lt;br /&gt;
&lt;br /&gt;
Pemrograman dengan SQL Server &lt;br /&gt;
&lt;br /&gt;
Database Security &lt;br /&gt;
&lt;br /&gt;
Data Warehouse/ OLAP &lt;br /&gt;
&lt;br /&gt;
Replication &lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;     &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span class=&quot;fullpost&quot;&gt;Selain bergabung dengan milis, kita juga bisa update pengatahuan TI kita dengan bergabung dengan berbagai forum IT. Kita juga bisa bergabung dengan situs tanya jawab TI yang paling populer yaitu &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://stackoverflow.com/&quot;&gt;http://www.stackoverflow.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/6966057432951140219/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2012/08/mari-bergabung-milis-it.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/6966057432951140219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/6966057432951140219'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2012/08/mari-bergabung-milis-it.html' title='Mari Bergabung Milis IT'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5776980471135706903.post-7475919808661654385</id><published>2012-08-02T10:52:00.000+07:00</published><updated>2012-08-02T10:52:00.317+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Video"/><title type='text'>Belajar Delphi Melalui Video</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Video kadang lebih bermakna dibanding tutorial berbentuk tulisan. Dari sebuah video terkandung begitu banyak hal. Demikian juga dengan belajar delphi. Kita dengan mudah bisa mendapatkan video tutorial delphi. Di bawah ini adalah daftar video tutorial delphi yang bisa didownload secara gratis&lt;br /&gt;
&lt;span class=&quot;fullpost&quot;&gt; &lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;blog&quot; style=&quot;color: black; font-family: Verdana, Geneva, sans-serif; font-size: 11px; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;blog_more&quot; style=&quot;margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;strong&gt;More Articles...&lt;/strong&gt;&lt;/div&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=126:movie-74-theadercontrol&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #74 - THeaderControl&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=124:movie-73-dfm-numbers&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #73 - DFM Numbers&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=122:movie-72-platform-assistant&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #72 - Platform Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=120:movie-71-essential-pascal-coderage-4-replay&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #71 - Essential Pascal (CodeRage 4 Replay)&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=117:movie-70-key-tags&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #70 - Key Tags&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=115:movie-69-self&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #69 - Self&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=113:movie-68-abusing-typed-constants&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #68 - Abusing Typed Constants&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=111:movie-67-form-ownership&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #67 - Form Ownership&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=109:movie-66-animating-adding-a-tlistboxitem&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #66 - Animating Adding a TListBoxItem&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=108:movie-65-firemonkey-periodic-table&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #65 - FireMonkey Periodic Table&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=106:movie-64-session-state-on-rest-server&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #64 - Session State on Rest Server&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=103:movie-63-using-jquery-mobile-with-intraweb&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #63 - Using jQuery Mobile with IntraWeb - CodeRage 6 Replay&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=102:movie-62-introduction-to-intraweb&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #62 - Introduction to Intraweb - CodeRage 6 Replay&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=101:movie-61-fishfacts-firemonkey&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #61 - FishFacts FireMonkey&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=95:movie-60-visual-form-inheritance&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #60 - Visual Form Inheritance&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=94:movie-59-popup-menu-from-a-button-click&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #59 - Popup Menu from a Button Click&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=92:movie-58-tdatasetfield&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #58 - TDataSetField&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=91:movie-57-scoped-enums&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #57 - Scoped Enums&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=90:movie-56-extracting-richtext-from-a-trichedit&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #56 - Extracting RichText from a TRichEdit&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=89:algorithms-4-merge-sort&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Algorithms #4 - Merge Sort&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=88:movie-55-ftp-password-recovery&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #55 - FTP Password Recovery&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=87:movie-54-dynamic-typing&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #54 - Dynamic Typing&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=86:movie-53-tdataset-field-access&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #53 - TDataSet Field Access&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=85:movie-52-tinifile&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #52 - TIniFile&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=84:movie-51-tstringlists-and-csv-data&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #51 - TStringLists and CSV Data&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=83:movie-50-tclientdataset-a-tprovider&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #50 - TClientDataSet &amp;amp; TProvider&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=82:movie-49-tclientdatasetclonecursor&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #49 - TClientDataSet.CloneCursor&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=81:movie-48-tdatasetdisablecontrols&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #48 - TDataSet.DisableControls&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=79:movie-46-migrating-from-the-bde-coderage-iii-replay&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #46 - Migrating from the BDE - CodeRage III Replay&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=80:movie-47-100-ide-hints-and-tips-coderage-iii-replay&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #47 - 100 IDE Hints and Tips - CodeRage III Replay&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=78:movie-45-quote-of-the-day&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #45 - Quote of the Day&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=77:movie-44-drag-and-drop&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #44 - Drag and Drop&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=76:movie-43-onsettext&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #43 - OnSetText&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=75:movie-42-hint-counter&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #42 - Hint Counter&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=73:movie-41-oncalcfields-fkcalculated-vs-fkinternalcalc&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #41 - OnCalcFields: fkCalculated vs. fkInternalCalc&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=72:movie-40-changing-how-fields-are-displayed&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #40 - Changing How Fields are Displayed&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=71:movie-39-xml-data-binding&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #39 - XML Data Binding&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=70:movie-38-charting-jpeg-compression&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #38 - Charting Jpeg Compression&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=69:movie-37-for-loop-ramblings&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #37 - For Loop Ramblings&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=68:movie-36-hyperlink-labels&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #36 - HyperLink Labels&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=67:movie-35-datasnap-part-1&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #35 - DataSnap (Part 1)&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=66:algorithms-3-selection-sort&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Algorithms #3 - Selection Sort&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=65:algorithms-2-insertion-sort&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Algorithms #2 - Insertion Sort&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=64:algorithms-1-bubblesort&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Algorithms #1 - Bubblesort&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=63:movie-34-parameters&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #34 - Parameters&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=61:movie-33-dockable-forms-2&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #33 - Dockable Forms 2&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=60:movie-32-dockable-forms&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #32 - Dockable Forms&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=59:movie-31-making-your-applications-talk&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #31 - Making Your Applications Talk&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=58:movie-30-exceptions-in-constructors-and-destructors&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #30 - Exceptions in Constructors and Destructors&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=57:movie-29-class-helpers&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #29 - Class Helpers&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=56:movie-28-flash-within-delphi&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #28 - Flash within Delphi&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=54:movie-27-dlls&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #27 - DLLs&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=53:movie-26-form-creation&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #26 - Form Creation&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=52:movie-25-enter-as-tab&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #25 - Enter as Tab&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=51:movie-24-dbgrid-ondrawcolumncell&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #24 - DBGrid OnDrawColumnCell&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=49:movie-23-images-on-the-clipboard&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #23 - Images on the Clipboard&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=48:movie-22-sql-part-four-insert&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #22 - SQL Part Four: Insert&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=47:movie-21-sql-part-three-update-and-delete&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #21 - SQL Part Three: Update and Delete&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=44:movie-20-scaleby&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #20 - ScaleBy&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=37:movie-19-hate-with-a-passion&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #19 - Hate With a Passion&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=36:movie-18-sender-as-and-is&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #18 - Sender, As and Is&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=35:movie-17-owner-vs-parent&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #17 - Owner vs. Parent&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=34:movie-16-autosize&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #16 - Autosize&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=33:movie-15-onresize-event&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #15 - OnResize Event&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=32:movie-14-anchors-and-constraints&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #14 - Anchors and Constraints&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=31:movie-13-align-and-margins&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #13 - Align and Margins&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=30:movie-12-tlistbox&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #12 - TListbox&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=29:movie-11-sql-part-two&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #11 - SQL Part Two&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=28:movie-10-sql-part-one&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #10 - SQL Part One&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=27:movie-9-virtualization&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #9 - Virtualization&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=26:movie-8-customer-20&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #8 - Customer 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=25:movie-7-a-data-aware-application&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #7 - A Data-Aware Application&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=24:movie-6-hiding-the-form-caption&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #6 - Hiding the form Caption&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=22:movie-5-my-first-php-application&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #5 - My First PHP Application&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=15:movie-4-delayed-form-creation&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #4 - Delayed Form Creation&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=14:movie-3-ide-tricks&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #3 - IDE Tricks&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=13:movie-2-writing-actions&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #2 - Writing Actions&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;a class=&quot;blogsection&quot; href=&quot;http://learndelphi.tv/index.php?option=com_content&amp;amp;view=article&amp;amp;id=12:creating-application-icons-with-gimp&amp;amp;catid=17:movie&amp;amp;Itemid=27&quot; style=&quot;color: #0e6caa; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Movie #1 - Icons&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; valign=&quot;top&quot;&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphigurus.blogspot.com/feeds/7475919808661654385/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://delphigurus.blogspot.com/2012/08/belajar-delphi-melalui-video.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/7475919808661654385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5776980471135706903/posts/default/7475919808661654385'/><link rel='alternate' type='text/html' href='http://delphigurus.blogspot.com/2012/08/belajar-delphi-melalui-video.html' title='Belajar Delphi Melalui Video'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>