EXEL automatické zkopírování buňky do dalšího listu podle zadané hodnoty



Zdravím mám dotaz ohledně kopírování buněk a nevím jestli to exel umí. Jedná se mi o to jestli jde když do zdrojové buňky A1 napíšu např. AHOJ a do zdrojové buňky A2 číslici 3 tak jestli jde aby se mi na další listu automaticky nakopírovali tři buňky s textem AHOJ. Díky za radu.
skrettte, jestli EXEL nevím, ale Excel to samozřejmě umí.
Můžete zkopírovat seznam a vložit ho do jiného sešitu aplikace Excel. Takže jste se ptali, jak zvládnout práci na násobku „úkolů“ najednou, ne? S výjimkou větvení.


Můžete mít více checkouts ze zdroje na lokálním počítači, suffixing název adresáře s názvem lístku, na kterém pracujete. Jen se ujistěte, aby se změny ve správném adresáři, v závislosti na úkolu ...


Směšování více úkolů v jedné pracovní kopii / commit může být velmi matoucí, zvláště pokud někdo potřebuje, aby svou práci zkontrolovat později. <p>je to pravděpodobně výstupní vyrovnávací paměť z grepu. můžete to zakázat pomocí <code>grep --line-buffered</code>.</p><p>ale nemusíte potrubí výstup z grep do awk. awk umí regexp přizpůsobit všechny vzorky sám.</p><p><code>tail -f test.txt | awk '/beam/ {print $3}'</code></p> <p>zvažte vytvoření <a href="http://www.alistapart.com/articles/goingtoprint/">list stylů pro tisková média</a> , který využívá místo ohraničení buněk a barvy pozadí vlastnost ohraničení tabulky - při tisku by se mělo vytvořit viditelné ohraničení:</p><pre><code>table { border:solid #000 !important; border-width:1px 0 0 1px !important; } th, td { border:solid #000 !important; border-width:0 1px 1px 0 !important; } </code></pre> <p>příkaz <code>merge</code> má složitou syntaxi a ještě složitější implementaci, ale v zásadě jde o spojení dvou tabulek, filtrování dolů na řádky, které je třeba změnit (vložit, aktualizovat nebo smazat), a poté provést požadované změny. vzhledem k těmto vzorovým údajům:</p><pre><code>declare @categoryitem as table ( categoryid integer not null, itemid integer not null, primary key (categoryid, itemid), unique (itemid, categoryid) ); declare @datasource as table ( categoryid integer not null, itemid integer not null primary key (categoryid, itemid) ); insert @categoryitem (categoryid, itemid) values (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 5), (3, 6), (4, 5); insert @datasource (categoryid, itemid) values (2, 2); </code></pre><p><strong> cíl </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 2 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 3 ║ ║ 3 ║ 5 ║ ║ 4 ║ 5 ║ ║ 3 ║ 6 ║ ╚════════════╩════════╝ </code></pre><p><strong> zdroj </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>požadovaným výsledkem je nahrazení dat v cíli daty ze zdroje, ale pouze pro <code>categoryid = 2</code>. po výše uvedeném popisu <code>merge</code> bychom měli napsat dotaz, který spojuje zdroj a cíl pouze na klíče, a filtrovat řádky pouze v klauzulích <code>when</code>:</p><pre><code>merge into @categoryitem as target using @datasource as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by source and target.categoryid = 2 then delete when not matched by target and source.categoryid = 2 then insert (categoryid, itemid) values (categoryid, itemid) output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>to dává následující výsledky:</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 2 ║ ║ 3 ║ 5 ║ ║ 3 ║ 6 ║ ║ 4 ║ 5 ║ ╚════════════╩════════╝ </code></pre><p>realizační plán je: <img src="https://i.stack.imgur.com/fovhu.jpg" alt="merge plan"></p><p>všimněte si, že jsou obě tabulky plně naskenovány. můžeme to považovat za neefektivní, protože pouze řádky, kde <code>categoryid = 2</code> bude ovlivněno v cílové tabulce. zde přicházejí varování v books online. jeden chybný pokus o optimalizaci, aby se dotkl pouze nezbytných řádků v cíli, je:</p><pre><code>merge into @categoryitem as target using ( select categoryid, itemid from @datasource as ds where categoryid = 2 ) as source on source.itemid = target.itemid and target.categoryid = 2 when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>logika v klauzuli <code>on</code> je použita jako součást spojení. v tomto případě je spojení úplným vnějším spojením (viz <a href="http://technet.microsoft.com/en-us/library/bb522522%28v=sql.105%29.aspx">tento záznam books online</a> proč). použití kontroly kategorie 2 na cílových řádcích jako součásti vnějšího spojení nakonec povede k odstranění řádků s jinou hodnotou (protože neodpovídají zdroji):</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 1 ║ 1 ║ ║ delete ║ 1 ║ 2 ║ ║ delete ║ 1 ║ 3 ║ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ║ delete ║ 3 ║ 5 ║ ║ delete ║ 3 ║ 6 ║ ║ delete ║ 4 ║ 5 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>kořenová příčina je ze stejného důvodu, proč se predikáty chovají v klauzuli vnější spojení <code>on</code> odlišně, než když jsou specifikovány v klauzuli <code>where</code>. syntaxe <code>merge</code> (a implementace spojení v závislosti na zadaných klauzulích) jen ztěžují vidět, že tomu tak je.</p><p> <a href="http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx">navádění v books online</a> (rozšířeno v položce <a href="http://technet.microsoft.com/en-us/library/cc879317%28v=sql.105%29.aspx">optimizing performance</a> ) nabízí navádění, které zajistí, že správná sémantika je vyjádřena pomocí syntaxe <code>merge</code>, aniž by uživatel nutně musel muset pochopit všechny podrobnosti implementace nebo zohlednit způsoby, kterými by optimalizátor mohl legitimně přeskupit věci z důvodů efektivnosti provádění.</p><p>dokumentace nabízí tři možné způsoby implementace časného filtrování:</p><p><strong> zadání podmínky filtrování v klauzuli <code>when</code> </strong> zaručuje správné výsledky, ale může znamenat, že více řádků je čteno a zpracováno ze zdroje a cíle tabulky, než je nezbytně nutné (viz první příklad).</p><p><strong> aktualizace prostřednictvím zobrazení </strong>, která obsahuje podmínku filtrování, také zaručuje správné výsledky (protože změněné řádky musí být přístupné pro aktualizaci prostřednictvím zobrazení), ale vyžaduje to vyhrazené zobrazení, které splňuje liché podmínky pro aktualizaci zobrazení.</p><p><strong> použití společného výrazu tabulky </strong> přináší podobné riziko při přidávání predikátů k klauzuli <code>on</code>, ale z poněkud odlišných důvodů. v mnoha případech to bude bezpečné, ale vyžaduje to odbornou analýzu prováděcího plánu, aby se to potvrdilo (a rozsáhlé praktické testování). například:</p><pre><code>with target as ( select * from @categoryitem where categoryid = 2 ) merge into target using ( select categoryid, itemid from @datasource where categoryid = 2 ) as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>výsledkem jsou správné výsledky (neopakované) s optimálnějším plánem:</p><p><img src="https://i.stack.imgur.com/tazmk.jpg" alt="merge plan 2"></p><p>plán čte pouze řádky pro kategorii 2 z cílové tabulky. to může být důležitým hlediskem výkonu, pokud je cílová tabulka velká, ale je příliš snadné tuto chybu získat pomocí syntaxe <code>merge</code>.</p><p>někdy je snazší zapsat <code>merge</code> jako samostatné operace dml. tento přístup může dokonce <strong> vést lépe </strong> než jediný <code>merge</code>, což je skutečnost, která lidi často překvapuje.</p><pre><code>delete ci from @categoryitem as ci where ci.categoryid = 2 and not exists ( select 1 from @datasource as ds where ds.itemid = ci.itemid and ds.categoryid = ci.categoryid ); insert @categoryitem select ds.categoryid, ds.itemid from @datasource as ds where ds.categoryid = 2; </code></pre> <p>po vykopání jsem zjistil, že drupal dodává hotový pojmenovaný nástroj pro můj přesný případ použití:</p><p><em> vložte řádek do db nebo aktualizujte existující, pokud již existuje. </em></p><p>tomu se říká <a href="http://drupal.org/node/310085">slučovací dotazy</a> , což lze u některých db motorů provést atomově.</p><p>syntext je celkem jednoduchý:</p><pre><code>db\_merge('example') -&gt;key(array('name' =&gt; $name)) -&gt;fields(array( 'field1' =&gt; $value1, 'field2' =&gt; $value2, )) -&gt;execute(); </code></pre> <p>registry <code>"*</code> a <code>"+</code> jsou pro schránku systému (<code>:help registers</code>). v závislosti na vašem systému mohou dělat různé věci. například v systémech, které nepoužívají x11 jako osx nebo windows, se registr <code>"*</code> používá pro čtení a zápis do systémové schránky. na systémech x11 lze použít oba registry. pro více informací viz <code>:help x11-selection</code>, ale v podstatě <code>"*</code> je analogický s x11 <em>primárním</em> výběrem (který obvykle kopíruje věci, které vyberete myší a pastami pomocí prostřední tlačítko myši) a <code>"+</code> je obdobné jako u x11 <em>clipboard</em> výběr (což je vlastní schránka).</p><p>pokud vše, co šlo přes hlavu, zkuste pomocí <code>"*yy</code> nebo <code>"+yy</code> zkopírovat řádek do schránky systému. za předpokladu, že máte vhodné možnosti kompilace, by měl fungovat jeden nebo druhý. možná budete chtít přeměnit to na něco výhodnější pro vás. například můžete v souboru ~/.vimrc zadat <code>vnoremap &lt;c-c&gt; "*y</code>, abyste mohli vizuálně vybrat a stisknout <kbd>ctrl</kbd>+<kbd>c</kbd> vyskočit do schránky systému.</p><p>mějte na paměti, že kopírování/vkládání ze systémové schránky <strong>nebude fungovat</strong> pokud <code>:echo has('clipboard')</code> vrací 0. v tomto případě není vim zkompilován s funkcí <code>+clipboard</code> a budete muset nainstalovat jinou verzi nebo znovu zkompilovat . některé linuxové distribuce standardně dodávají minimální instalaci vimu, ale obecně, pokud <strong>nainstalujte balíček <code>vim-gtk</code> nebo <code>vim-gtk3</code></strong> můžete získat další funkce.</p><p>můžete se také podívat na volbu <code>'clipboard'</code> popsanou v <code>:help cb</code>. v tomto případě můžete <code>:set clipboard=unnamed</code> nebo <code>:set clipboard=unnamedplus</code> provést všechny operace vyhození/smazání automaticky zkopírovat do systémové schránky. to by mohlo být nepříjemností v některých případech, kdy ukládáte něco jiného do schránky, protože to přepíše.</p><p>chcete-li vložit, můžete použít <code>"+p</code> nebo <code>"*p</code> (opět v závislosti na vašem systému a/nebo požadovaném výběru) nebo je můžete namapovat na něco jiného. typicky je zadávám, ale často se nacházím v režimu vkládání. pokud jste v režimu vkládání, můžete je stále vkládat pomocí správného odsazení pomocí <code>&lt;c-r&gt;&lt;c-p&gt;*</code> nebo <code>&lt;c-r&gt;&lt;c-p&gt;+</code>. viz <code>:help i\_ctrl-r\_ctrl-p</code>.</p><p>za zmínku stojí také možnost <code>paste</code> vim (<code>:help paste</code>). toto vloží vim do speciálního "režimu vkládání", který zakáže několik dalších možností, což vám umožní snadno vložit do vimu pomocí svého terminálového emulátoru nebo známé zkratky pro vložení multiplexeru. jednoduše zadejte <code>:set paste</code>, abyste jej aktivovali, vložte obsah a potom zadejte <code>:set nopaste</code>, abyste jej zakázali. alternativně můžete pomocí volby <code>pastetoggle</code> nastavit kód klíče, který přepíná režim (<code>:help pastetoggle</code>). doporučuji používat registry namísto těchto možností, ale pokud jsou stále příliš děsivé, může to být vhodné řešení, když si vylepšujete své vim chops.</p><p>podrobnější informace naleznete v tématu <code>:help clipboard</code>.</p> <p>rozhodně bych šel na <a href="http://api.drupal.org/api/drupal/modules!field!field.attach.inc/function/field\_attach\_update/7"><code>field\_attach\_update</code></a> .</p><p>myšlenka je jednoduchá. jednoduše načtěte uzel a uložte jej pomocí field\_attach\_update.</p><p>příklad:</p><pre><code>$node = node\_load($nid); $node-&gt;field\_name[language\_none][0]['value'] = 'new value'; field\_attach\_presave('node', $node); field\_attach\_update('node', $node); // clear the static loading cache. entity\_get\_controller('node')-&gt;resetcache(array($node-&gt;nid)); </code></pre><p>tím se nezmění žádné časové razítko ani žádný jiný háček, který node\_save obvykle vyvolá. načítání uzlu také vyvolá některé háčky, takže to pravděpodobně není tak efektivní.</p><p>pokud máte uzel a struktura uzlů je mrtvá jednoduchá, můžete to udělat také takto:</p><pre><code> $node = new stdclass(); $node-&gt;nid = $nid; // enter the nid taken. make sure it exists. $node-&gt;type = 'article'; $node-&gt;field\_name[language\_none][0]['value'] = 'new value'; field\_attach\_update('node', $node); field\_attach\_presave('node', $node); // clear the static loading cache. entity\_get\_controller('node')-&gt;resetcache(array($node-&gt;nid)); </code></pre><p>pokud se však pokoušíte aktualizovat něco jiného než pole, nebude to fungovat (stav komentáře, zveřejněný stav atd.). také pokud používáte node\_save, cache pro konkrétní uzel bude automaticky vymazána pro různé metody, které musíme vymazat pomocí 'entity\_get\_controller'.</p><p><strong> aktualizace: </strong> zdá se, že byste také měli zavolat <code>field\_attach\_presave()</code>, aby ostatní moduly mohly správně zpracovat vstup pole. souborový modul jej například používá k nastavení stavu souboru na trvalé pomocí tohoto zavěšení. aktualizoval jsem své 2 příklady výše.</p> <p>entityfieldquery používá sadu háčků k propojení s moduly úložiště pole, jako je například pole sql storage, aby pracovalo pro pole i další vlastnosti uzlu. dlouhodobě je entityfieldquery mnohem spolehlivější způsob dotazování na jakýkoli typ entity av některých situacích může provádět dotazy na více entit (viz <a href="http://api.drupal.org/api/drupal/modules--field--field.module/function/field\_has\_data/7">field\_has\_data</a> nebo <a href="http://api.drupal.org/api/drupal/modules--field--modules--list--list.module/function/\_list\_values\_in\_use/7">\_ list\_values\_in\_use ()</a> pro příklad.</p><p>zde je jednoduchý příklad použití entityfieldquery k získání seznamu všech uzlů publikovaných před konkrétním časovým razítkem:</p><pre><code>$query = new entityfieldquery(); $query -&gt;entitycondition('entity\_type', 'node', '=') -&gt;propertycondition('status', 1, '=') -&gt;propertycondition('created', '1294694496', '&lt;'); $result = $query-&gt;execute(); </code></pre><p>$ výsledky z tohoto dotazu by vypadaly asi takto:</p><pre><code>array ( [node] =&gt; array ( [1] =&gt; stdclass object ( [nid] =&gt; 1 [vid] =&gt; 49 [type] =&gt; article ) [2] =&gt; stdclass object ( [nid] =&gt; 2 [vid] =&gt; 2 [type] =&gt; page ) ) ) </code></pre><p>toto pole byste pak mohli použít jako vstup pro node\_load\_multiple:</p><pre><code>$nodes = node\_load\_multiple(array\_keys($result['node'])); </code></pre> <p>nezkoušel jsem to, ale zjevně.</p><pre><code>drush help dl </code></pre><blockquote> <p>--destination cesta, na kterou bude projekt zkopírován. pokud zadáváte relativní cestu, vezměte na vědomí, že se jedná o kořen drupal root (je-li zavázán)).</p> </blockquote>