【MACRO】Google Apps Script 質問スレ【DRIVE】
Google Apps Script でのプログラミング等に関する質問スレです Excel や Access の VBA に不満のあるあなた web アプリだけでなくクライアントアプリからも利用したいあなた ローカルなデータベースやファイルだとバックアップに不安のあるあなた ム板に無かったので立ててみます Google Apps Script ttps://developers.google.com/apps-script/ Google Drive API ttps://developers.google.com/drive/ Getting Started with the Google Data Python Library ttps://developers.google.com/gdata/articles/python_client_lib ■関連スレ Google Maps API 質問箱 http://peace.2ch.net/test/read.cgi/tech/1131627583/ Microsoft SkyDrive API http://peace.2ch.net/test/read.cgi/tech/1385604796/ 【GoogleAppsScript】猿92【研究せよ!!!】 http://nozomi.2ch.net/test/read.cgi/php/1398600864/ GoogleAPIってどうよ? http://nozomi.2ch.net/test/read.cgi/php/1018614427/ Google App Engine for Python 6アプ目 http://nozomi.2ch.net/test/read.cgi/php/1358570953/ Google App Engine for java http://peace.2ch.net/test/read.cgi/tech/1317639323/ GoogleWebToolkit[GWT]について語ろう http://nozomi.2ch.net/test/read.cgi/php/1147975874/ っつーか PritView でよくね ただの html 取れるぞ >>331 レス有難うございます。PrintViewでどうにかできそうですか! でもどうすればいいか解らないレベルなので とりあえず図書館でjavascriptの本を借りてきました 「はじめに」 読んでるうちに寝てもうたw ちなみに>329の2を試してみたときのコードが function getCsvSample() { var folderId = '***********'; var destfolder = DriveApp.getFolderById(folderId); var date = "2016-08-04"; var response = UrlFetchApp.fetch("http://hesonogoma.com/stocks/media/swf/copy_csv_xls_pdf.swf" ;); destfolder.createFile(date + '.csv', response.getContentText('Shift_JIS')); } です。拾ってきたコードをいじって実行したら 謎の文字化け集団が襲ってきました (ここで心折れる) GASでスクレイピングしたいんですが、UrlFetchAppで取得したHTML(XMLじゃない)をDOM化するのってできますでしょうか? 正規表現で必要なところを取ってくるのは心が折れそうなので、セレクタで処理したいです。 >>329-333 Shift_JIS ではなく、UTF-8 で保存すれば? その後、TeraPad などのエディタで、Shift_JIS に変換する >>336 レスありがとうございます 試してみたんですが、うまく変換できませんでした やっぱりurlが違うのかな、、 このスレの質問、回答がほとんど理解できてない程度ので もう少し基本からじっくり勉強してみます! >>329 の1だけ 引き続き質問を残させてください GASでgoogleAPIを叩いてgmailの下書きを作成するものを作ったのですが、 これを毎日作成(雛形をコピー)するスプレッドシードで使いたいと思っています。 スプレッドシートに書いてコピーすると、gAPIの紐付けプロジェクトが変わっているので設定しなおさなければ使えず、困っています。 スプレッドシートをコピーして、シート上のボタンを押したらすぐに下書きを作れる状態を作りたいのですが、どのような方法がありますか? >>340 GASのGmailAppでダメ? ttp://qiita.com/minanami/items/87641f09192be1b5010b 個人的にはフォームから入力させた方がGUI的にいいと思うけど スプレッドシートに保存したいならその後GASで自動追加させとけばいいし >>339 329です 参考にしてみます ありがとうございます! >>329 ,>>343 よっしゃ、俺がやってやらぁ!って思って意気込んでサイトみたら普通にJSONで取れた ttp://hesonogoma.com/stocks/data/japan-all-stock-prices.json >>344 おお、、、これで目的は果たせそうです 皆さん長々とありがとうございました!勉強も少しずつ続けます >>339 ありがとうございます。ですが、そのライブラリだと正規表現を使うのと全く変わらないです。 いっそのこと自作しようと思います。 ありがとうございました。 ここ最近CalendarAppのアクセス頻度でエラーが出るようになった Googleはアナウンスなしで仕様変更してくるのやめてほしい 株価のサイトにはNASDAQとかもあるのか このJSONデータが無料ってすごいな プロジェクトの.gsファイルって並び替えってできないんですか? google sitesとスプレッドシートとの連携について教えて下さい。 google sitesで作成したページ(AAAについての確認とします)上に個人名でいくつかの CK BOXがあります。 ---------------------------- <AAAについての確認> □Aさん □Bくん □Cちゃん □Dちゃん □Eさん 送信 ---------------------------- いくつかのCK BOXにCKが入っているとして”送信”を押したら次の様にスプレッドシートを操作する方法を 教えて下さい。 1. googleドライブ上の指定されたスプレッドシート内に<AAAについての確認>というシートが作成される。 2. 1で作成されたシートにAさんからEさんまでのCK BOX STATUSを記録する 3. 送信した日付も記録する 目的としては、家族内情報共有ホームページを作成したいです。 Googleサイトが無償でホームページが作成できるとのことでGoogleサイトでのこの内容の動きが 出来るか教えていただきたいです。 フォームの名前を<AAAについての確認>とすればいい。 GASであるサイトをスクレイピングしたいけど、ログインしないと情報が取得できない。 クッキーをセットしたりすればログインしてアクセスできるけど、それってセキュリティ的に危険かな? GASでスプレッドシートをいじろうと思ってるのですか、まず有効なスプレッドシートを選択してくださいと。と表示されてできません。なにがダメなのでしょうか。下記のようにやっています。 var ss = SpreadsheetApp.OpenById(""); var sheet = ss.getSheetByName(""); SpreadsheetApp.setActiveSheet(sheet); ID、シート名ともにあってます… スプレッドシートからスクリプトエディタを使わないとできないのでしょうか?今は別にスクリプトファイルを作ってやってます >>356 3行目は開いてるスプレッドシートに対してしか効かないとか。 試してないけど。 別に開かずとも変数sheetは取れてるだろうから、3行目は書かなくてもその後のやりたいことはできるのでは? >>361 もしくは、3行目を SpreadsheetApp.setActiveSheet じゃなくて ss.setActiveSheet ってできないかな? みなさんありがとうございました! Var SS = SpreadsheetApp.openById(""); Var sheet = SS.getSheetByName(""); SpreadsheetApp.getActivesheet (); でエラー出ずにやることができました GASでローカルのtxt、たとえばc:\\test.txtなんかをスプレッドシートに展開したいのだけれど csvを展開するスクリプト(https://github.com/prog-mitsu/importCsv ) をいじくりまわしてもどうもうまくいかない このスクリプトだと、フォームが表示されるのだけれど フォームの表示なしで、固定のテキストファイル(たとえばc:\\test.txt)を展開することって GASではむりなんかいな? ローカルのものをGoogleDriveにupするAPIはあるよ ローカルのものをGoogleDriveにupしたあと それをGASで開くんだよ >>369 その、「ローカルのものをGoogleDriveにup」をフォームなどの表示なしに自動化したいのです >>370 デスクトップ版のGoogle Drive使って 自動同期でうpすれば? 半年ほど前にお世話になった者です スプレッドシートでimportdata関数を使っていたんですが Loading......が頻発するので、やはりGASで対処したいのです データ取得までは出来てると思うのですが、シートに書き込む段階が全くおかしいようで・・ function fetchData(){ var response = UrlFetchApp.fetch("http://hesonogoma.com/stocks/data/japan-all-stock-prices" ;); var json = response.getContentText(); var kakaku = JSON.parse(json); var range = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1, 1); range.offset(0, 0, 6000, 26).clear(); for(var i=0; i<kakaku.length; i++) { var event = kakaku[i]; range.offset(i+1,0).setValue(event); } } 正解か、参考になるサイトをご教授いただきたいのです 色んなサイトのコード切り貼りしすぎて、頭がおかしくなってきたw >>374 仕組みがよくわからないんですが、 ログにはデータ表示されるのでアクセスは出来ているはず・・・ ・・もしかしてアクセス権というのは違法性の問題とかですか!? すみません、だったら質問とりやめますが 色々やってみたら一応なんとかなりました 1年ちょいのモヤモヤが一気に解消して、いま涙目になってますウォォ ありがとうございました! エラーのメールいっぱいくるからトリガー止めようと思っても保存押したらサーバーエラーになっちゃう "サービスで1日に使用しているコンピュータ時間が長すぎます”っていうエラー出るだけど どういうエラーか分かりますか? なにもいじってないのに昨晩から急に出るようになった 1日のMAXが累計1時間だっけか 処理回数が多いか、実行時間が長いんだろうな 1日止めて何も変えずトリガー元に戻しましたが、今のところ問題無し 数は減らしましたがペースは変えず Spreadsheetで行の非表示/表示はsheet.hideRow(rowIndex)/sheet.unhideRow(rowIndex)ですが、 ある行が非表示であるかどうかはどのように確認できますか? >>385 ありがとうございます。それってどのクラスから生えてますか? 一応、下のようになってみましたができませんでした。 sheet.getRange(1, 1).visible >>388 ありがとうございます。確かにそのページによるとサポートされてなさそうですね。 stackoverflowでいくつかの同様な質問を見つけましたが、できない的なことが書かれてました。 visibleの件ももう少し調べてみて、できそうになかったら諦めます。 var triggerUniqueId = ScriptApp.newTrigger("doPost2") .timeBased() .after(100) .create() .getUniqueId(); これを実行すると以下の3パターンの動作になるのだがなんとかならないかな? ・すぐにdoPost2に飛んでくる ・数秒〜数十秒後にdoPost2に飛んでくる ・どんだけ待とうがdoPost2に飛んでこない(何分か待ってれば飛んでくるのか?) ちなみに飛んでこなかった場合は全てのトリガを削除してからやり直してる。 微妙に勘違いされそうな書き方だったので追記 doPost2に飛んできたときはその中でトリガを削除しているので 「飛んでこなかった場合は全てのトリガを削除してからやり直してる。」ということです。 100ms後にdoPost2に飛ばしたいってこと? 最終的になにがしたいかわからん そのidでなにすんの? 目先の目的は「指定した時間後にdoPost2を実行したい」です。 100msが1秒になるにはまだ許容範囲ですが、 さすがに数十秒後やかなり待っても飛んでこないのはなにか設定がおかしいのかなと。 トリガーをつくるのではなく、Utilities.sleepじゃダメ? 大雑把に以下のような流れになるのでsleepでは無理っす。 1, PayPalからPOSTがくる 2, PayPalにHTTP 200を返す 3, PayPalにPOSTを投げる https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNIntro/ function doPost(e) { トリガ仕掛ける HTTP 200を返す } function doPost2() { POSTを投げる } いろいろ試したけど60秒とか大きな値ならそれっぽいタイミングでトリガがかかるみたい。 短すぎる設定時間はダメなのかなぁ。 トリガの指定って分単位だった気がする 内部的にcronだから ○時ちょうどにトリガー仕掛けたくて試したけど無理で、59分にしかけて00秒まで待つって実装にしたことがある 非同期処理ができないから難しいかも 秒数は一定じゃないから、1分後にトリガー設定しても最大1分59秒後になることもある にしても面倒な仕様だなPaypal VBAのCall ステートメントは、Google Apps Scriptの場合どう記述すればいいですか? アクティブシートのカーソルがあるセル(アクティブセル)の行番号を、別のシート(setei)のB1へコピーしたいのですが、 うまく行きません。 5行目のvar copyValue〜の値をmsgBoxで出力すると、希望通りの値が出ているので、そこまでは合っていると思うのでが、 6行目で取得した行番号を、別のシートのB1に入れる所で躓いています。解決方法を教えて頂けないでしょうか? function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet_copyFrom = sheet.getActiveSheet(); var sheet_copyTo = sheet.getSheetByName('setei'); var copyValue = sheet_copyFrom.getActiveCell().getRow(); sheet_copyTo.getRange('B1').setValues(copyValue); } 行番号をコピーするの?アクティブセルの値じゃなくて? sheet_copyTo.getRange('B1').setValue(copyValue); >>401-402 希望どうりのことができました。ありがとうございます! スペルが間違っていたとは・・ 質問です。 スプレッドシートのシートを並び替えることはできますか? セル範囲のデータならSORTでできることは知っているのですが、シートには使えませんよね。 日付がシート名になってて、それを昇順に並び替えしたいのです。 よろしくお願いします。 出来ないことはなだろうが面倒くさいし、丸投げならお断り。 IDかわりましたけど404です。 >>405 めんどくさい方法ですけど、一応自分で作ってはみました。 これよりいい方法があるのか、改めてお知恵をお貸しください。 var ss = SpreadsheetApp.openById(file.getId()); var sheets = ss.getSheets(); // シート名(yyyyMMdd形式)で昇順ソート sheets.sort(function(a, b){ var aa = Number(a.getSheetName()) || a.getSheetName(); var bb = Number(b.getSheetName()) || b.getSheetName(); if (aa < bb) return -1; if (aa > bb) return 1; return 0; }); // 別スプレッドシートにコピー for (var n in sheets) { var sheet = sheets[n]; var sheetName = sheet.getSheetName(); sheet.copyTo(sortedSs).setName(sheetName); } 同じスプレッドシートでの並べ替えを諦めて、別スプレッドシートにソート済みをコピーしたってだけのものです。 1.シート数を取得 2.全シート名を配列へ 3.配列をソート array.sort() 4.シートを移動 >>407 4. シートを移動 これができなくて悩んでたんですが SpreadsheetオブジェクトにinsertSheetメソッドやmoveActiveSheetメソッドがありますね。 何とか実装できそうです。 ありがとうございました。 getValuesで取得した二次配列の、あるインデックス番号Ary[n][n]から、セル番号を取得するにはどうすれば良いでしょうか? 又、それはAPIを使わず、javaの配列処理の中で完結できるものなのでしょうか? gasなのかわからないですが、間違いならすみません。 フォームで@郵便番号を入れたら住所の一部を表記させたいのですが、できるのでしょうか? A特定の数字をいれたら、外部からその数字に該当するデータを引っ張れるでしょうか?(社員コードいれなら社員名がでるイメージです) 誠にすみませんが、可能ならばご教授 おねがいします。 gasはさわったことないので、できそうならば、やってみたいとおもいます。 >>413 1.できます 2.できます 3.ajax >>414 おしえてくださいばっかりでもうしわけありませんが、本当に素人でして。 コードやら参考のURLでもありましたらおねがいします。 /** * @return ライブラリ名 */ とやっているのに返り値のメソッド補完が効きません… 何か間違っているでしょうか… >>418 コメント付けると補完が効くようになると聞きました 外部サイトで申し訳ないのですが、GASについて下記のサイトのチュートリアルを試していたのですが ttps://tonari-it.com/gas-web-appli-spreadsheet-append/ 真似をしてみても、エラー出てしまいます。 getActiveSheet を呼び出す権限がありません(行 2、ファイル「test2」、プロジェクト「HTMLページ表示」) 自分のコードが間違えたのかと、コードをコピペしたり、スクリプト認証を再度許可を出すために 現在とは別にファイルを作り直したりしたのですが、同じエラーが出てしまいます。 このエラーを回避するにはどうすれば良いでしょうか? すみません自己解決しました。 原因はスクリプトにプロジェクトのトリガーを設定していなかったことが原因だった様です。 公開済みのHTMLなのでアクセスすれば良いだけでなのに、なんでや!と思っていたのですが、 googleのwebアプリの場合、公開時にアサインされるHTMLへのリンクは、実はHTMLへのリンクではなく、 リンク > Ajax > .gs > html という流れらしく(たぶん) 3番目の.gsにトリガーが設定されてないとダメという感じの様です。なので.gsのトリガー設定した所動きました。 [設定したトリガー] 実行:doGet イベント:スプレッドシートから・起動時に設定 このトリガー自体適当に設定したので、spreadsheetに紐付いた(コンテナバウンド)webアプリがこのトリガーで本当に良いのか? .gsがスタンドアローンだったらどうするのか?などは自分の知識ではまだ不明です。 割と有名(みんなが引っかかる)ワナらしく、「GAS 実行する権限がありません」でググると色々出てきます。 すみませんが質問させてください。 現在、google appsのみで簡易ウェブアプリの制作を試みています。 構成は htmlservice+gas+spredseet(DB) です。 各種申請をweb化するのですが、アクセスしたユーザーのgmailアドレスもDBに格納します。 session.getactiveuser().getemailを利用するため、スクリプトの実行者は「アプリケーションアクセスしているユーザー」にしています。 そうすると、spreadsheetも全員に公開する必要がありますが、spreadsheetの中身は個人情報を少し含むため見られたくありません。 なにかいい方法はありますでしょうか、、、fusiontablesなどであればできるのでしょうか? ユーザーごとの情報はユーザープロパティに入れるべきでは? >>429 ご助言ありがとうございます。 propaties serviceについて調べた見ましたが、ユーザープロパティとして保存した場合、他のユーザーからは一切アクセスできないものと思いました。 一部のユーザー(システム管理を行う数名)に対しては、データの参照ができるようにしたいと思ったおります(申請されたデータを承認するようなワークフローアプリを検討しているため。後出して申し訳ありません) read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる