SQLの窓

2020年10月15日


VBScript を『管理者として実行する』には、Shell の runas ( 右クリックメニューの実行と同等 ) で実現します / Jscript も追加

UAC によるセキュリティの影響で VBScript を使う場合、管理者権限で実行しないとレジストリの一部には書き込めるのに重要なフォルダには書き込めないというような OS が決めたルールがあります。

それに対する対処の最も簡単な方法は、以下の内容ををスクリプトの先頭に記述する事です

🔻 VBScript

Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Wscript.Echo "ここは管理者権限で実行されます"


🔻 Jscript

※ Jscript は WScript 等、大文字小文字の区別があるので注意です。 ※ ダウンロードは、拡張子 .htm で SHIFT_JIS ですので、利用時は .js に変更してお使い下さい。
var obj = new ActiveXObject("Shell.Application");
if ( WScript.Arguments.length == 0 ) {
	obj.ShellExecute( "wscript.exe", WScript.ScriptFullName + " runas", "", "runas", 1 );
	WScript.Quit();
}

WScript.Echo( "ここは管理者権限で実行されます" );

Shell.ShellExecute method

これは、VBScript から利用可能な Shell の機能を使って、右クリックメニューにある『管理者として実行』を実行する方法です。ここでは日本語では無く runas と言う文字列を使って管理者として実行させています。

但し、引数がなかった場合の処理としては処理終了します。ですからこのスクリプトでは、引数をダミーで一つセットして( この場合一つめの runas がそうです )自分自身を再度呼び出しています。

つまり、Windows からすれば二度目の実行が管理者としての実行になります。

この場合は、スクリプトに引数を渡す事ができません。もし渡したいしたい場合は、違ったトリックを使う必要があるのに注意して下さい。(その場合は、外部ファイルから入力するのがもっとも簡単で確実だと思います)





posted by lightbox at 2020-10-15 08:10 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2020年10月13日


clipboard.js を使用してテキストをコピーする際に clipboard.js が必要とするパーツと意味

配布ページの説明では、『トリガー要素にdata-clipboard-target属性を追加します。』とありますが、ここではトリガー要素であるボタンのコンテナである div 要素に設定しています。

Advanced Usage では、トリガー要素を直接指定してトリガーの処理の後に、new ClipboardJS であらかじめ作成されたイベントより return される文字列をクリップボードに送る事ができます。
<script>
var clipbpardText = "";

$(function(){
	var clipboard = new ClipboardJS('#button1' , {
		text: function(trigger) {
			return clipbpardText;
		}
	});

	clipboard.on('success', function(e) {
		alert("クリップボードにコピーしました");
	});

	$("#button1").on("click", function(){
		clipbpardText = $("#text").val();
	})
});
</script>
<textarea id="text"></textarea>
<button type="button" id="button1">実行</button>
以下では、new ClipboardJS('.clipboard'); で作成されたオブジェクトは、処理が成功した時のイベントの使用方法として実装していますが、作業の妨げになるのであれば削除したほうがいいでしょう。

#src_clipboard の div は、画面外に作成したテキストの一時置き場です。clipboard.js は常にここからテキストを取得してクリップボードに渡します。この手法は、clipboard.js が内部でも使っている手法です。
<!DOCTYPE html>
<html>
<head>
<title>clipboard.js</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha512-hDWGyh+Iy4Mr9AHOzUP2+Y0iVPn/BwxxaoSleEjH/i1o4EVTF/sh0/A1Syii8PWOae+uPr+T/KHwynoebSuAhw==" crossorigin="anonymous"></script>
<script>
$(function () {

	// **********************************************************************
	// オブジェクトや内部イベントの構築
	// ▼ 内部イベントのパーツ
	// class に clipboard を持つコンテナ内でイベントが起きた時
	// data-clipboard-target の内容の中にあるテキストを取り出してコピーする
	// コンテナ内のイベントが終わってから処理されるので、
	// イベント内で data-clipboard-target の中に必要なテキストをセットする
	// **********************************************************************
	var clipboard = new ClipboardJS('.clipboard');

	// コピー完了後の処理( 無くてもよい )
	clipboard.on('success', function(e) {
		alert("クリップボードにコピーしました");
	});

	// クリップボードにコピーを実行する
	$("#btn").on("click", function(){
		$("#src_clipboard").text( $("textarea").val() );
	});

});
</script>

<style>
html, body {
	height:100%;
}
textarea {
	width: 800px;
	height: calc(100% - 100px);
	font-size: 18px;
	font-weight: 600;
}
#src_clipboard {
	position:absolute;
	left:-1000px;
	width:900px;
	white-space:pre-wrap;
	word-wrap:break-word;
}
</style>
</head>
<body>
<div id="src_clipboard"></div>
<div class="clipboard" data-clipboard-target="#src_clipboard">
	<input type="button" value="コピー" id="btn">
</div>
<textarea></textarea>
</body>
</html>



posted by lightbox at 2020-10-13 19:20 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

GAS : Google スプレッドシートのセルを使用してメール送信

セルの B1、B2、B3 に入力してメールを送信します。



GAS : sendEmail
GAS : msgBox
GAS : SpreadsheetApp クラス



シート名は メール送信となっており、getSheetByName で対象のシートオブジェクトを得ます。

実行ボタンは図形描画で追加して、右上のメニューから コード.gs 内に定義した function 名を割り当てます。一度割り当てたら、図形は右クリックでメニュー選択が可能になります。

セル内の改行は ALT+Enter です。 

// ************************************
// メール送信
// ************************************
function SendMail_1() {

  var result = Browser.msgBox('確認', 'メールを送信しますか?', Browser.Buttons.YES_NO);
  
  if ( result != "yes" ) {
    return;
  }
  
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName("メール送信");  
  
  // 宛先
  var targetRange = sheet.getRange('B1');
  var targetTo = targetRange.getDisplayValue();
  var targetList = targetTo.split(",");

  // 件名
  targetRange = sheet.getRange('B2');
  targetSubject = targetRange.getDisplayValue();

  // 本文
  targetRange = sheet.getRange('B3');
  targetBody = targetRange.getDisplayValue();
  
  for(var i = 0; i< targetList.length; i++ ) {
  
    GmailApp.sendEmail( targetList[i].trim(), targetSubject, targetBody );
  
  }

  Browser.msgBox("処理が終了しました");

}




posted by lightbox at 2020-10-13 10:40 | GAS | このブログの読者になる | 更新情報をチェックする

HTML Application : JavaScript で新しい Excel の Book を作成する

JavaScript から Excel にアクセスする場合、『Quit メソッドを呼び出した後、Excel がシャットダウンしない』というバグがあるのでその対応を組み込んでいます



実行後に作成された Excel Book
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta charset="utf-8">
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">

<title>新しい Excel の Book を作成する</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha512-MoRNloxbStBcD8z3M/2BmnT+rg4IsMxPkXaGh2zD6LGNNFE80W3onsAhRcMAMrSoyWL9xD7Ert0men7vR8LUZg==" crossorigin="anonymous" />

<style>
/* ****************************
 上下エリア
 フィットコントロール用
******************************/
html,body {
	height: 100%;
}
/* ****************************
 それぞれのエリアの特性
******************************/
/* 基本枠 */
body {
	margin: 0;
}
/* 上固定部分 */
#head {
	padding: 16px;
	display: block;
	margin: auto;
	width: 100%;							/* 幅 */
	height: 70px;							/* 高さ */
	background-color: #e0e0e0;
}
/* 下スクロール部分 */
#extend {
	padding: 4px 16px;
	display: block;
	margin: auto;
	width: calc( 100% - 3px );				/* 幅 */
	height: calc( 100% - 70px - 2px );		/* 高さ */
	border: solid 2px #c0c0c0;
	overflow: scroll;
}

</style>

<script>
// ****************************
// Excel.Application 用
// ****************************
var Excel = null;
var Book = null;
var Worksheet = null;
// 外部プログラムの実行用
var WshShell = new ActiveXObject("WScript.Shell");
var targetPath = WshShell.ExpandEnvironmentStrings("%TEMP%") + "\\新しいBook.xlsx";

// jQuery 用専用ロードイベント
$(function(){

	$("#filepath").text( targetPath );

	// ボタンのイベント
	$("#action").on("click", function(){

		// 実行確認
		if ( !confirm("新しいBook を作成してもよろしいですが?") ) {
			return;
		}
	
		// 複数の Excel 処理を対話で続ける時の為に Excel が null の時のみ作成する方法
		// ※ 今回は必ず実行後終了させるのでこの if 文は必要ありません
		if ( Excel == null ) {
			// ****************************
			// 基本オブジェクトを作成
			// ****************************
			Excel = new ActiveXObject("Excel.Application");
		}

		// ****************************
		// 表示( テストの時は表示 )
		// 完成した場合は false にしますが、
		// なんらかのエラーが起きた場合はタスクマネージャから Excel
		// を終了させる必要があります
		// ****************************
		Excel.Visible = true;

		// ****************************
		// 警告を出さないようにする
		// 使用すると上書きの警告が
		// 出なくなります
		// ****************************
		Excel.DisplayAlerts = false;

		// ****************************
		// ブック追加
		// ****************************
		Excel.Workbooks.Add();

		// ****************************
		// 追加したブックを取得
		// ※ 新規なのて 1 番目
		// ****************************
		Book = Excel.Workbooks( Excel.Workbooks.Count );

		// ****************************
		// 先頭シートを選択する
		// 少なくとも最初に一つシートが存在します
		// ****************************
		Worksheet = Book.Worksheets( 1 );

		// ****************************
		// シート名設定
		// ( アクティブなので直接 )
		// ****************************
		Worksheet.Name = "新しい情報";

		// ****************************
		// Add では 第二引数に指定した
		// オブジェクトのシートの直後に、
		// 新しいシートを追加します。
		// ****************************
		Book.Worksheets.Add(null,Worksheet);

		// ****************************
		// シート名設定
		// ( 2番目のシート )
		// ****************************
		Book.Worksheets(2).Name = "予備情報";

		// ****************************
		// 新しい情報 シートを選択
		// ****************************
		Book.Worksheets("新しい情報").Select();

		// ****************************
		// コード列を文字列に設定
		// ****************************
		Worksheet.Columns("A:A").Select();
		Excel.Selection.NumberFormatLocal = "@";
		Worksheet.Columns("D:D").Select();
		Excel.Selection.NumberFormatLocal = "@";
		Worksheet.Columns("J:J").Select();
		Excel.Selection.NumberFormatLocal = "@";

		// ****************************
		// テーブル情報をセルへセット
		// ****************************
		// タイトル部分の参照
		$("#tbl th").each(function(idx){
			Worksheet.Cells(1, idx+1) = $(this).text();
		});

		// 行一覧の参照
		$("#tbl tr").each(function(row){
			$(this).find("td").each(function(idx){
				Worksheet.Cells(row, idx+1) = $(this).text();
			});
		});

		// ****************************
		// セルをデータに合わせて
		// 整理して左上を選択
		// ****************************
		Worksheet.Columns("A:K").Select();
		Worksheet.Columns("A:K").EntireColumn.AutoFit();
		Worksheet.Range("A1").Select();

		// ****************************
		// 保存
		// 拡張子を .xls で保存するには
		// Call ExcelBook.SaveAs( FilePath, 56 ) とします
		// ****************************
		var filePath = $("#filepath").text();

		try {
			Book.SaveAs( filePath );
			Book.Close();
		}
		catch (e) {
			alert("Book.SaveAs でエラーが発生しました");

			console.dir(e);
			ExcelQuit();
			return;
		}

		// Excel の完全終了
		ExcelQuit();

		// ****************************
		// 終了確認
		// ****************************
		alert("処理が終了しました \n\n 保存したブックを開きます");

		// ****************************
		// Windows からの Excel 起動
		// ****************************
		WshShell.Run( "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " + filePath );

	});

});

// ****************************
// JavaScript による
// Excel の完全終了処理
// ****************************
var idTmr = "";
function ExcelQuit() {
	Excel.Quit();
	Excel = null;
	idTmr = window.setTimeout("Cleanup();",1);
}
function Cleanup() {
	window.clearInterval(idTmr);
 	CollectGarbage();
}
</script>
</head>
<body>
	<div id="head">
		<input id="action" type="button" value="ブックの作成" class="btn btn-primary"> <span class="ml-5" id="filepath">c:\temp\新しいBook.xlsx</span>
	</div>

	<div id="extend">
		<table class="table table-striped">
		<tbody id="tbl">
			<tr><th>社員コード</th><th>氏名</th><th>フリガナ</th><th>所属</th><th>性別</th><th>作成日</th><th>更新日</th><th>給与</th><th>手当</th><th>管理者</th><th>生年月日</th></tr>
			
			<tr><td>0001</td><td>山田 太郎</td><td>ウラオカ トモヤ</td><td>0003</td><td>0</td><td>2005-09-12</td><td>2005-11-28</td><td>400000</td><td>9000</td><td>0001</td><td>2012/03/21</td></tr>
			<tr><td>0002</td><td>山村 洋代</td><td>ヤマムラ ヒロヨ</td><td>0003</td><td>1</td><td>2005-06-17</td><td>2005-09-18</td><td>300000</td><td></td><td>0001</td><td>2001/01/02</td></tr>
			<tr><td>0003</td><td>多岡 冬行</td><td>タオカ フユユキ</td><td>0002</td><td>0</td><td>2005-08-14</td><td>2005-11-14</td><td>250000</td><td></td><td>0001</td><td>2001/01/01</td></tr>
			<tr><td>0004</td><td>高田 冬美</td><td>タカタ フユミ</td><td>0003</td><td>1</td><td>2005-06-13</td><td>2005-10-05</td><td>250000</td><td></td><td>0001</td><td>2001/01/01</td></tr>
			<tr><td>0005</td><td>内高 友之</td><td>ウチタカ トモユキ</td><td>0003</td><td>0</td><td>2005-09-12</td><td>2005-11-10</td><td>150000</td><td></td><td></td><td>2001/01/01</td></tr>

		</tbody>
		</table>

	</div>

</body>
</html>


▼ 以下の設定を IE11 で行うと、拡張子を .html に変更して IE11 でも実行できます






このページの PDF



posted by lightbox at 2020-10-13 09:54 | HTA ( HTMLアプリケーション ) | このブログの読者になる | 更新情報をチェックする

2020年10月11日


Java + Swing : JTable に CSV フォーマットのテキストファイルを読み込む

動作確認は、以下の環境で行っています
JDK11
✅ Visual Studio Code + Java Extension Pack
テキストファイルの入力は行毎に読み込む方法で、オーソドックスな以下のクラスを使います。 ✅ FileInputStream => InputStreamReader => BufferedReader キャラクタセットの設定は InputStreamReader で行い、読み込みは BufferedReader の readLine を使用したループ処理です
while ( null != (line_buffer = br.readLine() ) ) {
	// ループ処理
}
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Main extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private JPanel panel;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	// コンストラクタ
	public Main() {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 1000, 700);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);

		// ボタン
		JButton btnNewButton = new JButton("読み込み");
		btnNewButton.setBounds(10, 10, 91, 21);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				loadCsv();
				
			}
		});
		
		contentPane.setLayout(null);
		contentPane.add(btnNewButton);
		
		panel = new JPanel();
		panel.setBounds(12, 52, 960, 600);
		panel.setLayout(new BorderLayout(0, 0));
		contentPane.add(panel);
		
		table = new JTable() {

			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			}
			
		};

		JScrollPane scrollPane = new JScrollPane(table);
		panel.add(scrollPane);
		
		scrollPane.setVerticalScrollBarPolicy(
				JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setHorizontalScrollBarPolicy(
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

	}
	
	// ********************
	// 初期化
	// ********************
	private void reset() {

		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		dtm.setRowCount(0);
		
		int cols = table.getColumnCount();

		for( int i = cols-1; i >= 0; i-- ) {
			table.removeColumn((table.getColumnModel()).getColumn(i));
		}
		
		// データモデルも初期化
		dtm.setColumnCount(0);

	}
	// ********************
	// 行を全て削除
	// ********************
	private void clear(){
		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		dtm.setRowCount(0);
	}
	
	// ********************
	// CSV
	// ********************
	private void loadCsv(){
		
		reset();

		try {

			FileInputStream fis = new FileInputStream("c:\\app\\java20\\sample-10-12\\社員マスタ.csv");
			InputStreamReader isr = new InputStreamReader(fis, "MS932");
			BufferedReader br = new BufferedReader(isr);

			String line_buffer;
			String[] adata;
			int line_count = -1;
			while ( null != (line_buffer = br.readLine() ) ) {

				// カンマで分解
				adata = line_buffer.split(",");

				// 1行目はタイトル
				if ( line_count == -1 ) {
					int count = adata.length;
					// 先に全ての列を登録する必要があります
					for( int i = 0; i < count; i++) {
						String id = String.format("col%d", i);
						addColumn( table,  id );
					}
					// タイトル文字列の変更を行っています。
					// 変更しない場合は、タイトルは列を登録時の第二引数になります
					int i = 0;
					for( String value:  adata ) {
						String id = String.format("col%d", i++);
						setColumnTitle( table, id, value );
					}
				}
				// 2行目以降がデータ
				else {
					addRow(table);
					int i = 0;
					for( String value:  adata ) {
						setColumn( table, line_count, i++, value );
					}
				}

				line_count++;

			}
			
			br.close();
			isr.close();
			fis.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	// ****************************
	// 列の追加	
	// ****************************
	private void addColumn(JTable table, String name) {
		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		dtm.addColumn(name);
	}
	// ****************************
	// 列のタイトル文字列変更
	// ****************************
	private void setColumnTitle(JTable table, String name,String title) {
		TableColumn tc1 = table.getColumn(name);
		 tc1.setHeaderValue(title);
		 tc1.setIdentifier(name);
	}
	// ****************************
	// 空の行追加
	// ****************************
	private void addRow(JTable table) {
		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		Object[] obj  = null;
		dtm.addRow(obj);
	}
	// ****************************
	// 指定カラムへデータをセット
	// ****************************
	private void setColumn(JTable table,int row,int col, String data) {
		table.setValueAt( data, row,  col  );
	}
	
}




posted by lightbox at 2020-10-11 21:21 | java : Swing | このブログの読者になる | 更新情報をチェックする

Python : shift_jis の3列の csv フォーマットのデータを ttk.Treeview に表示する



Python : ttk.Treeview で表形式を使用して環境変数の一覧表示 で作成した Treeview を利用しました

sample_textfile.py
# shift_jis の3列の csv フォーマットのデータを Treeview に表示する
#
from buill_grid import *

with open('cp932.txt', encoding='cp932') as fp:
	for line_buffer in fp:
		# 行末の改行を削除する
		line_buffer = line_buffer.rstrip("\n")
		print(line_buffer)
		# カンマで分割
		csv = line_buffer.split(",")
		print(csv)
		# Treeview にセット
		grid.insert("","end",values=(f"{csv[0]}",f"{csv[1]}", f"{csv[2]}"))

# ウインドウ開始
form.mainloop()

buill_grid.py
import tkinter as tk
import tkinter.ttk as ttk

# メインフォーム
form = tk.Tk()
form.title("タイトル")
form.geometry("800x600")

# ツリービュー(表)
grid = ttk.Treeview(form, show="headings")

# 列ID
grid["columns"] = ("A","B","C")

# 列幅
grid.column("A", width=150)
grid.column("B", width=150)
grid.column("C", width=150)

# タイトル
grid.heading("A", text="A")
grid.heading("B", text="B")
grid.heading("C", text="C")

# 位置指定して作成
grid.place(x=20, y=40, height=500)

# スクロールバーを同期させて form に配置
vsb = ttk.Scrollbar(form, orient="vertical", command=grid.yview)
vsb.place(x=20+450+3, y=40+3, height=500)
grid.configure(yscrollcommand=vsb.set)





posted by lightbox at 2020-10-11 19:41 | Python | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり