SQLの窓

2022年12月29日


Visual Studio Code で行末のスペースを消去する

保存時に実行したければ、"files.trimTrailingWhitespace": true です。自動保存にすると、ソース変更すれば実行されます。



【Microsoftの最新記事】
posted by lightbox at 2022-12-29 10:09 | Microsoft | このブログの読者になる | 更新情報をチェックする

Microsoft Edge を終了してもメモリに残るのを避ける

何かの都合( IEモードとか ) でたまに開くだけなのに、メモリを無駄に消費しますね...



posted by lightbox at 2022-12-29 09:39 | Microsoft | このブログの読者になる | 更新情報をチェックする

2022年11月17日


VBScript / JScript: Windows標準のオブジェクト( CDO.Message ) と ロリポップメールを使ってメール送信

▼ VBScript
▼ JScript
コマンドプロンプトから、以下のようにしてテストしています cscript mail.vbs cscript mail.js ssl を使用( ポート 465 )するので、smtpusessl が true になっています。 mail.vbs
' ***********************************************************
' 使用するパラメータ
' ***********************************************************
strFrom = "わたしです <ロリポップメールアドレス>"

strTo = "あなたです <送り先メールアドレス>"

strServer = "smtp.lolipop.jp"

nPort = 465
strUser = "ロリポップメールアドレス"
strPass = "パスワード"

' ***********************************************************
' オブジェクト
' ***********************************************************
Set Cdo = WScript.CreateObject("CDO.Message")

' ***********************************************************
' 自分のアドレスと宛先
' ***********************************************************
Cdo.From = strFrom
Cdo.To = strTo

' ***********************************************************
' 件名と本文
' ***********************************************************
Cdo.Subject	= "件名の文字列 / " & Now()
Cdo.Textbody = "テキスト本文" & vbCrLf & "改行は vbCrLf"

' ***********************************************************
' CC BCC HTMLメール( CC BCC はどちらか片方  )
' ※ 両方指定すると CC
' ***********************************************************
Cdo.Cc = "メールアドレス1,メールアドレス2"
'Cdo.Bcc = "メールアドレス3,メールアドレス4"
Cdo.Htmlbody = "<img src=""https://winofsql.jp/image/winofsql.png"">"

' ***********************************************************
' ファイル添付あり
' ***********************************************************
Cdo.AddAttachment( "C:\Users\sworc\Pictures\0152-ac.jpg" )
Cdo.AddAttachment( "C:\Users\sworc\Pictures\ai\2022-08-24-1.png" )

' ***********************************************************
' 設定
' ***********************************************************
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strServer
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = nPort
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true

Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUser
Cdo.Configuration.Fields.Item _ 
 ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPass

' ***********************************************************
' 設定の反映
' ***********************************************************
Cdo.Configuration.Fields.Update

' ***********************************************************
' 送信
' ***********************************************************
on error resume next
Cdo.Send
if Err.Number <> 0 then
	strMessage = Err.Description
else
	strMessage = "送信が完了しました"
end if
on error goto 0

Wscript.Echo strMessage





mail.js
// ***********************************************************
// 使用するパラメータ
// ***********************************************************
var strFrom = "わたしです <ロリポップメールアドレス>";

var strTo = "あなたです <送り先メールアドレス>";

var strServer = "smtp.lolipop.jp";

var nPort = 465;
var strUser = "ロリポップメールアドレス";
var strPass = "パスワード";

// ***********************************************************
// オブジェクト
// ***********************************************************
var Cdo = WScript.CreateObject("CDO.Message")

// ***********************************************************
// 自分のアドレスと宛先
// ***********************************************************
Cdo.From = strFrom
Cdo.To = strTo

// ***********************************************************
// 件名と本文
// ***********************************************************
Cdo.Subject	= "件名の文字列 / " + new Date();
Cdo.Textbody = "テキスト本文\r\n改行は \\r\\n";

// ***********************************************************
// CC BCC HTMLメール( CC BCC はどちらか片方  )
// ※ 両方指定すると CC
// ***********************************************************
Cdo.Cc = "メールアドレス1,メールアドレス2"
//Cdo.Bcc = "メールアドレス3,メールアドレス4"
Cdo.Htmlbody = "<img src=\"http://winofsql.jp/image/winofsql.png\">"

// ***********************************************************
// ファイル添付あり
// ***********************************************************
Cdo.AddAttachment( "C:\\Users\\sworc\\Pictures\\0152-ac.jpg" )
Cdo.AddAttachment( "C:\\Users\\sworc\\Pictures\\ai\\2022-08-24-1.png" )

// ***********************************************************
// 設定
// ***********************************************************
Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strServer
Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = nPort
Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true

Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUser
Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPass

// ***********************************************************
// 設定の反映
// ***********************************************************
Cdo.Configuration.Fields.Update()

// ***********************************************************
// 送信
// ***********************************************************
var strMessage
try {
	Cdo.Send()
	strMessage = "送信が完了しました"
}
catch ( error ) {
	strMessage = error.message;
}

WScript.Echo( strMessage );





posted by lightbox at 2022-11-17 16:19 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする

2022年08月14日


C# : HttpClient で Post と Get する汎用 static クラス

UrlEncode をキャラクタセットを指定して送れるようになっています。受信データは、Content-Type でキャラクタセットが指定されておれば、自動的に変換されています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace winofsql {

	class Tool {

		// 戻される文字列は、サーバー側で Content-Type に Charset が
		// 指定されておれば自動変換されます

		// *********************************************
		// UTF-8 POST
		// *********************************************
		public static async Task<string> Post(string url, Dictionary<string, string> param) {
			string result = "";

			try {
				HttpClient httpClient = new HttpClient();
				httpClient.MaxResponseContentBufferSize = int.MaxValue;
				HttpContent content = new FormUrlEncodedContent(param);
				var response = await httpClient.PostAsync(url, content);
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

			return result;

		}

		// *********************************************
		// エンコード指定 POST
		// *********************************************
		public static async Task<string> Post(string url, string encoding, Dictionary<string, string> param) {
			string result = "";
			string query_string = "";
			byte[] data1 = null;
			byte[] data2 = null;
			string data3 = null;

			foreach (KeyValuePair<string, string> kvp in param) {
				if (query_string == "") {
					query_string += "";
				}
				else {
					query_string += "&";
				}

				data1 = Encoding.GetEncoding(encoding).GetBytes(kvp.Value);
				data2 = WebUtility.UrlEncodeToBytes(data1, 0, data1.Length);
				data3 = Encoding.GetEncoding(encoding).GetString(data2, 0, data2.Length);
				query_string += kvp.Key + "=" + data3;
			}

			try {

				HttpClient httpClient = new HttpClient();
				HttpContent content = new StringContent(query_string);
				content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
				var response = await httpClient.PostAsync(url, content);
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

			return result;

		}

		// *********************************************
		// URL のみ呼び出し GET
		// *********************************************
		public static async Task<string> Get(string url) {
			string result = "";

			HttpClient httpClient = new HttpClient();

			HttpResponseMessage response = null;
			try {
				response = await httpClient.GetAsync(url);
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}
			// 接続に失敗
			if (response == null) {
				return result;
			}

			try {
				response.EnsureSuccessStatusCode();
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}
			// HTTP 応答の失敗
			if (!response.IsSuccessStatusCode) {
				return result;
			}

			// 内容を文字列として取得
			try {
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

			return result;

		}

		// *********************************************
		// データ呼び出し( UTF-8 ) GET
		// *********************************************
		public static async Task<string> Get(string url, Dictionary<string, string> param) {

			string query_string = "";

			foreach (KeyValuePair<string, string> kvp in param) {
				if (query_string == "") {
					query_string += "?";
				}
				else {
					query_string += "&";
				}
				query_string += kvp.Key + "=" + WebUtility.UrlEncode(kvp.Value);
			}

			return await Get(url + query_string);

		}

		// *********************************************
		// データ呼び出し( エンコード指定 ) GET
		// *********************************************
		public static async Task<string> Get(string url, string encoding, Dictionary<string, string> param) {

			string query_string = "";
			byte[] data1 = null;
			byte[] data2 = null;
			string data3 = null;

			foreach (KeyValuePair<string, string> kvp in param) {
				if (query_string == "") {
					query_string += "?";
				}
				else {
					query_string += "&";
				}
				data1 = Encoding.GetEncoding(encoding).GetBytes(kvp.Value);
				data2 = WebUtility.UrlEncodeToBytes(data1, 0, data1.Length);
				data3 = Encoding.GetEncoding(encoding).GetString(data2, 0, data2.Length);

				query_string += kvp.Key + "=" + data3;
			}

			return await Get(url + query_string);

		}

	}
}


呼び出し
string result = await winofsql.Tool.Post(
	"http://localhost/lightbox/sample/test.php",
	"shift_jis",
	new Dictionary<string, string>() { { "field1", "日本語" }, { "field2", "表示" } });

if (result.PadRight(5).Substring(0, 5) == "ERROR") {
	Debug.WriteLine(result);
}

関連する記事

Framework4(C#) : WebClient で Post と Get する汎用 static クラス
Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス
Android で Post と Get


posted by lightbox at 2022-08-14 12:02 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

2022年04月29日


キーボード入力をファイル化

置き換え

type con > a.txt




追加( Append )

type con >> a.txt
終了時は 改行入力後、CTRL+Z を入力してEnter です

type nul > ファイル名で、ファイルを空で初期化できます。

posted by lightbox at 2022-04-29 14:35 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

コマンド リダイレクト演算子を使用する( Using command redirection operators )

✅ Microsoft ドキュメント
コマンド リダイレクト演算子を使用する

⭐ 単純な リダイレクト は > です。
 コマンドプロンプトに表示されるはずの文字列をファイルに書き込みます。

⭐ >> を使うと追加書き込みです。

このような記号は、リダイレクト演算子と呼ばれます。

STDIN

0

キーボード入力

STDOUT

1

標準出力

STDERR

2

Error output to the Command Prompt window

0、1、2 は ハンドル番号で、既存のハンドルへのリダイレクトを指定するには、アンパサンド(&)文字の後にリダイレクトしたいハンドル番号を使用します。

なので、2>&1 は 標準エラー出力を標準出力にリダイレクトする事を意味します。

▼ 解りやすいテストはエラーだけに着目して、以下のように実行します。

C:\temp>dir x
 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 40B9-7D17 です

 C:\temp のディレクトリ

ファイルが見つかりません
( x が存在しないので『ファイルが見つかりません』と言うエラーメッセージが出ます ) この『ファイルが見つかりません』は、dir x > message.txt としても message.txt には書き込まれまれずに、コマンドプロンプトに表示されます。

しかし、以下のようにすれば全て書き込む事ができます。

dir x > message.txt 2>&1
この方法は解りにくいですが、標準出力と標準エラー出力を同時にリダイレクトしたいときに意味があります。
dir x 2> message.txt
だと、ファイルが見つかりません だけが書き込まれてしまいます。

キーボード入力をファイル化

リダイレクト演算子を使用して、キーボードから入力した文字列をテキストファイルに書き込む事ができます。
type con > message.txt
type コマンドは、ファイルの内容をコマンドプロンプトに表示するコマンドですが、con と言う特殊な予約文字列を使用すると、キーボードをファイルとみなした動作を行います。 ※ 終了時は 改行入力後、CTRL+Z を入力してEnter です

空のファイルを作成する

nul と言う予約文字列を使用して以下のように実行します
type nul > message.txt

実行結果を表示しない

nul は存在しないファイルのようなものなので、標準結果への出力を無かった事にできます
dir *.* > nul
posted by lightbox at 2022-04-29 14:26 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

アンパサンド(&) を使用して複数のコマンドを一行で続けて実行

以下は、ファイル名を指定して実行からの起動ですが、コマンドプロンプトを表示したままで保持し、必要がなくなればすぐ閉じる事ができます
(もちろんコマンドプロンプトからの実行でもかまいませんが、その場合は pause は必要無いです)

/c は、/c の後の文字列を新しい cmd.exe で実行した後、cmd.exe を終了するという意味なので、dir を実行した後、pause で一時停止して入力待ちとなり、何かキーを押せば cmd.exe が終了します。

最後に pause を使う方法は、コンソールに出力された結果を画面で確認できるようにする為に用いられます。

cmd /c dir & pause


& による一行の複数実行は、複数のアプリケーション(バッチファイル内の行単位の処理)をプログラムから呼び出したい(call コマンドを使用)場合で、外部にバッチファイルを作りたくない場合に使用します。


次のサンプルは、ユーザフォルダの dir の結果をテキストファイルにリダイレクトして dir の結果をメモ帳で開きます。

notepad の起動に start を使用しているので、元の cmd.exe は終了して結果の dir.log を表示したメモ帳のみが Windows 上に残ります( start が無いと、cmd.exe が notepad.exe の終了を待ちます )
cmd /c cd %HOMEPATH% & dir > c:\temp\dir.log & start notepad c:\temp\dir.log



ダウンロードしたファイルをエクスプローラから実行する場合は、『許可する』にチェックして『適用』して下さい。






posted by lightbox at 2022-04-29 14:09 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

コマンドプロンプトの省略ディレクトリ変更

例えば、C:\Program Files\Common Files へ移動したい場合、他に一致するディレクトリがなければ、以下のタイプで移動可能です。

cd \pr*\c*

環境変数にディレクトリがセットされている場合は、

cd %temp%

のように使用してそのディレクトリへ移動出来ます。 通常、コマンドプロンプトを実行すると、最初のディレクトリはユーザディレクトリになります。その下には、デスクトップやピクチャなど特別なものがたくさんあるので、以下のように移動可能です。

C:\Users\lightbox>cd *top C:\Users\lightbox\Desktop>cd ..\p* C:\Users\lightbox\Pictures>

posted by lightbox at 2022-04-29 01:04 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

2022年01月02日


VSCode : あるショートカットをぜひ設定して、SHIFT_JIS が化けた時とりえず正しく表示する



SHIFT  + ALT のショートカットはどちらかといえば『特殊なもの』という印象があるので、ショートカットそのものと、各 settings.json を直接開くようにしています。

S : Settings
W : Workspace
D : Directory
K : Keybord Shortcut




SHIFT + ALT + S でユーザの設定を開いて、先頭の SHIFT_JIS の設定の - ( ハイフン ) を一時的に削除してとにかく SHIFT_JIS で表示してしまう設定にします( 終わったら元に戻す )


言語別に SHIFT_JIS を強制するのは以下のようにしていますが、csv を言語化するには csv をそのように登録してくれる拡張をインスト−ルします。( コマンドパレットから changeLanguageMode でいまある言語の確認 )
        "[csv]": {
            "files.encoding": "shiftjis"
        },
        "[vbs]": {
            "files.encoding": "shiftjis",
            "editor.insertSpaces": true
        },
        "[bat]": {
            "files.encoding": "shiftjis"
        },
        "[powershell]": {
            "files.encoding": "shiftjis"
        },



言語で定義したら、拡張子への対応は以下のようにして行っています。
        "files.associations": {
            "*.mnu": "csv",
            "*.ujis": "perl",
            "*.932": "csv",
            "*.jsp": "java",
            "*.htm": "html",
            "*.hta": "html",
            "*.xlsx": "excel"
        },




posted by lightbox at 2022-01-02 11:17 | Visual Studio Code | このブログの読者になる | 更新情報をチェックする

「送る」からファイルのダンプ

GitHub







※コマンドプロンプトの操作
Q : 終了します。
スペースキー : 次ページを表示します。
Enterキー : 次の行を表示します

dump.vbs
if WScript.Arguments.Count = 1 then
	strMessage = "送るから実行して下さい" & vbCrLf & vbCrLf
	strMessage = strMessage & "※ リンク先の最後の数字はコマンドプロンプトの行数です   " & vbCrLf
	strMessage = strMessage & "※ プロパティよりウインドウを最大化する方法もあります   " & vbCrLf
	Call MsgBox(strMessage,0,"lightbox")
	Wscript.Quit
end if

Set WshShell = CreateObject( "WScript.Shell" )   
Set Fso = CreateObject( "Scripting.FileSystemObject" )

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

strCommand = "cmd /k mode CON lines="&WScript.Arguments(0)&" & cscript.exe """ & _
strCurPath & "\dump_c.vbs"" """ & WScript.Arguments(1) & """ | more & pause"
Call WshShell.Run( strCommand )


dump_c.vbs
' ****************************************************
' ファイルを16進数でダンプします
' ****************************************************
Dim Fs,Stream
Dim InFile
Dim Kana
Dim KjFlg
Kana = Array( _
"。","「","」","、","・","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ", _
"ー","ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ", _
"タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ", _
"ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン","゙","゚" )

Set Fs = CreateObject( "Scripting.FileSystemObject" )
Set Stream = CreateObject("ADODB.Stream")

InFile = WScript.Arguments(0)

Dim LineBuffer,DispBuffer,CWork,nCnt,strBuff,i,j

if not Fs.FileExists( InFile ) then
	Wscript.Echo "ファイルが存在しません"
	Wscript.Quit
end if

' ------------------------------------------------------
' Stream のオープン
Stream.Open
 
' ------------------------------------------------------
' Stream タイプの指定
Stream.Type = 1		' StreamTypeEnum の adTypeBinary
 
' ------------------------------------------------------
' 既存ファイルの内容を Stream に読み込む
Stream.LoadFromFile InFile
 
' ------------------------------------------------------
' バイナリ型の Stream オブジェクトからを読み取って加工
Bcnt = 0
nCnt = 0
KjFlg = ""

Do while not Stream.EOS

	if ( nCnt MOD 16 ) = 0 then
		Wscript.Echo "          0  1  2  3  4  5  6  7" _
		& "  8  9  A  B  C  D  E  F"
		Wscript.Echo "--------------------------------" _
		& "------------------------------------------"
	end if

	' 16 バイトの読込
	LineBuffer = Stream.Read(16)

	strBuff = ""
	For i = 1 to LenB( LineBuffer )
		CWork = MidB(LineBuffer,i,1)
		Cwork = AscB(Cwork)
		Cwork = Hex(Cwork)
		Cwork = Ucase(Cwork)
		Cwork = Right( "0" & Cwork, 2 )
		DispBuffer = DispBuffer & Cwork & " "
		strBuff = strBuff & CharConv( Cwork )
	Next

	Wscript.Echo _
		Right( _
			"00000000" & Ucase(Hex( nCnt * 16 )), 8 _
		) & " " & _
		Left(DispBuffer & String(49," "), 49 ) & strBuff
	DispBuffer = ""

	nCnt = nCnt + 1
 
Loop
 
' ------------------------------------------------------
' Stream を閉じる
Stream.Close

Set Stream = Nothing
Stream = Empty
Set Fs = Nothing
Fs = Empty

' ****************************************************
' 生データのテキスト
' ****************************************************
function CharConv( HexCode )

	Dim nCode

	nCode = Cint( "&H" & HexCode )

	if KjFlg = "" then
		if &H81 <= nCode and nCode <= &H84 or _
			&H88 <= nCode and nCode <= &H9f or _
			&HE0 <= nCode and nCode <= &HEA then
			KjFlg = HexCode
			CharConv = ""
			Exit Function
		end if
	else
		if HexCode <> "00" then
			KjFlg = KjFlg & HexCode
			CharConv = Chr( Cint( "&H" & KjFlg ) )
		else
			CharConv = ".."
		end if
		KjFlg = ""
		Exit Function
	end if

	if 0 <= nCode and nCode <= &H1F then
		CharConv = "."
	end if
	if &H20 <= nCode and nCode <= &H7E then
		CharConv = Chr(nCode)
	end if
	if &H7F <= nCode and nCode <= &HA0 then
		CharConv = "."
	end if
	if &HA1 <= nCode and nCode <= &HDF then
		CharConv = Kana(nCode-&HA1)
	end if
	if &HE0 <= nCode and nCode <= &HFF then
		CharConv = "."
	end if

end function


エクスプローラで SendTo フォルダに移動するには、アドレスバーに sendto と直接入力します。






posted by lightbox at 2022-01-02 09:44 | 右クリックで「送る」 | このブログの読者になる | 更新情報をチェックする

2021年08月07日


GAS : 自分の共有ドライブ一覧とマイドライブのルートフォルダ一覧

スプレッドシートに出力します

Logger.log がとても使いやすくなりましたが、あくまでデバッグ目的になるのでスプレッドシートに結果を残します。実行前に出力する列単位のクリアを行っていますが、マクロで取得したコードです。

Drive API サービスの設定

GAS からは、V2 の利用となるので注意が必要です。V3 ではパラメータが違います

マイドライブのルートフォルダのソート

そのままではソートされないので、一旦配列へセットしてソートしてから出力しています
function listDrive() {

    // **************************************************
    // 選択したシートを対象とします
    // **************************************************
    var spreadsheet = SpreadsheetApp.getActive();

    // **************************************************
    // 列クリア
    // **************************************************
    spreadsheet.getRange('A:E').activate();
    spreadsheet.getActiveRangeList().clear({contentsOnly: true, commentsOnly: true, skipFilteredRows: true});

    // **************************************************
    // ドライブ一覧 (100件まで:それ以上は nextPageToken を使う)
    // Drive API v2
    // **************************************************
    var response = Drive.Drives.list({"maxResults":100});
    var drives = response.items;
    var targetRange;
    for (i = 0; i < drives.length; i++) {

        Logger.log('%s (%s)', drives[i].name, drives[i].id);
        targetRange = spreadsheet.getRange('A' + (i+1));
        targetRange.setValue(drives[i].name);
        targetRange = spreadsheet.getRange('B' + (i+1));
        targetRange.setValue(drives[i].id);

    }

    // **************************************************
    // マイドライブルート内のフォルダの一覧 (Drive API は必要ない)
    // **************************************************
    var folders = DriveApp.getRootFolder().getFolders();
    var a = new Array();

    while (folders.hasNext()) {
        var folder = folders.next(); 
        Logger.log(folder.getName());
        a.push(folder.getName());
    }

    a.sort()
    for (i = 0; i < a.length; i++) {
        targetRange = spreadsheet.getRange('E' + (i+1));
        targetRange.setValue(a[i]);
    }

}


GitHub


posted by lightbox at 2021-08-07 15:38 | GAS | このブログの読者になる | 更新情報をチェックする

2021年03月15日


Google Apps Script(GAS) で、Google Classroom に投稿する



ドキュメントでは、REST API なので、UrlFetchApp クラスを使うのか? とか思ってしまいますが、そもそも それだと auth が必要なのでまだ試してしません。

で、そんな事をしなくてもそれぞれの REST の クラスのメソッドに引数を渡す形で実行できます。
但し、Classroom Service が拡張なので、スクリプトエディタのサービスの追加より API を実行可能にしておく必要があります。



以下のサンプルでは、Classroom の一覧取得後に目的の id を確認して固定で投稿しています。
function myFunction() {

	// **************************************************
	// Classroom 一覧	
	// **************************************************
	var response = Classroom.Courses.list();
	var courses = response.courses;
	for (i = 0; i < courses.length; i++) {
		Logger.log('%s (%s)', courses[i].name, courses[i].id);
	}

	// **************************************************
	// POST する JSON	
	// **************************************************
	var target = "35126354603";

	var data = {
		"courseId" : target, 
		"materials": [
			{
				"link": {
					"url": "https://news.google.com/?hl=ja&tab=rn1&gl=JP&ceid=JP:ja",
					"title": "Google ニュース",
					"thumbnailUrl": ""
				}
			}
		],
		"text": "Google Apps Script による Classroom への投稿",
		"assigneeMode": "ALL_STUDENTS",
		"state": "PUBLISHED"
	};

	Classroom.Courses.Announcements.create(data, target);  

}

Logger.log の代わりに Gmail で自分のアドレスに送信したほうが良い場合もあります。
// The code below will send an email with the current date and time.
var now = new Date();
GmailApp.sendEmail("mike@example.com", "current time", "The time is: " + now.toString());

関連する記事

Google Classroom のテーマ画像のサイズと既存画像をテーマ画像として使用してみた手順



courses.announcements.create リファレンス



posted by lightbox at 2021-03-15 14:04 | GAS | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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