タダスケのIT備忘録

IT系の個人的備忘録。法律事務所勤務。

GASでスプレッドシートのデータを取得しgoogleドキュメントのテキストを置換する

ショートカット

ショートカット 内容
ctrl+r スクリプト実行のショートカット
ctrl+space コンテンツアシスト(入力補助)
alt+/ 単語補完
ctrl+enter ログの表示
ctrl+/ コメント
ctrl+左右 単語単位で移動
alt+左右 行頭行末へ移動
ctrl+d 行削除

スプレッドシートのデータを取得する

基礎的なこと(練習)

スプレッドシートのidは,urlの一部

https://docs.google.com/spreadsheets/d/{id}/edit#gid=0

A1のテキストをログに表示する

    var SApp = SpreadsheetApp.openById("{id}");
    Logger.log(SApp.getSheets()[0].getRange(1, 1).getValue());

2次元配列を1次元にする

    var array = [['bob','tom'],'sam'];
    Logger.log(Array.prototype.concat.apply([],array));

本番

以下のスプレッドシートから,データを取り出す

1列目 2列目
項目 文字列
X住所 東京都
Y住所 大阪府
C氏名 クライアント
OP氏名 相手方
var SApp = SpreadsheetApp.openById("{id}");//スプレッドシートアップを取得
var sheet = SApp.getSheets()[0];//1番左のシートを取得
var values = sheet.getDataRange().getValues();//全範囲のデータを取得
var array = sheet.getRange(1,1,sheet.getLastRow()).getValues();//1列目のデータを取得
array = Array.prototype.concat.apply([],array);//2次元配列を1次元化する

// スプレッドシートのデータを取得する
var XAddress = values[array.indexOf('X住所')][1];
var YAddress = values[array.indexOf('Y住所')][1];
var XName = values[array.indexOf('X氏名')][1];
var Yame = values[array.indexOf('Y氏名')][1];
  
// 以下,googleドキュメント
var document = DocumentApp.getActiveDocument();//バインドされたgoogleドキュメントを取得
var body = document.getBody();//body部分を取得
var str = body.getText();//body部分のテキストを取得

var str = str.replace(/@X氏名/g,XName);//正規表現で置換
body.setText(str);//bodyにテキストをセットする

参考書籍

モバイルデバイスの場合にコンテンツを非表示にしてボタンで開閉する

表示

デスクトップのとき

開閉ボタン 非表示
コンテンツ 表示

モバイルのとき

開閉ボタン 表示
コンテンツ 非表示

html

<button id="openBtn">open</button>
<div id="openContent">
    hogehoge
</div>

css

#openBtn {
    /*  記述不要
    display: block;
    */
}
#openContent {
    display: none;
}

@media screen and (min-width: 600px){

#openBtn {
    display: none;
}
#openContent {
    display: block;
}

JS(jQuery)

$(function(){

$("#openBtn").on("click",function(){
    $("#openContent").slideToggle();
});

});

phpでマークダウン記法を使う

Parsedownを使った。

parsedown.org

require_onceするときの,絶対パスの指定方法で少し悩んだ

ドメイン直下からの絶対パスでの指定方法
include($SERVER['DOCUMENT_ROOT'] . '/path/file_name.php');
$
SERVER[‘DOCUMENT_ROOT’]はドキュメントルート(URLでいうとドメイン直下)のパスになるので、これでドメインからの絶対パス指定になります。

web-codery.com

オプションは,設定が必要なものは2つだけ

lh-sd.hatenablog.com

結局,以下のような感じで大丈夫

require_once ($_SERVER['DOCUMENT_ROOT'] . '/php/parsedown/Parsedown.php');
$Parsedown = new Parsedown();
$Parsedown->setMarkupEscaped(true);
$Parsedown->setBreaksEnabled(true);

foreach($rows as $row){
// 抽出したrowのテキストフィールドに,パースしたテキストを入れ直している
$row['text'] = $Parsedown->text($row['text']);
}

jQueryでサイトの一部要素をスライドさせる

dtをクリックするとddが開閉する(slideToggle)

        $(function(){
            (注:ここにeachが抜けていた)
            var dl = $(this);
            var allDt = dl.find('dt');
            var allDd = dl.find('dd');
            var allDt = $('dl').find('dt');
            var allDd = $('dl').find('dd');
            allDd.hide(); 
            allDt.css('cursor','pointer'); 

            allDt.click(function(){
                var dd = $(this).next();
                dd.slideToggle();
            });
        });
            <dl>
                <dt>item 1</dt>
                <dd>content 1</dd>
                <dt>item 2</dt>
                <dd>content 2</dd>
                <dt>item 3</dt>
                <dd>content 3</dd>
            </dl>

            <dl>
                <dt>item 1</dt>
                <dd>content 1</dd>
                <dt>item 2</dt>
                <dd>content 2</dd>
                <dt>item 3</dt>
                <dd>content 3</dd>
            </dl>

参考にした書籍

改訂版 Webデザイナーのための jQuery入門

改訂版 Webデザイナーのための jQuery入門

xfreeにPHPアプリをアップしたときの備忘

はまったところなど

.htaccessがなくて少し詰まった

smartyを入れた

flightは,簡易なテンプレートしかないように見える

smartyだと,テンプレートの方でクエリしたデータをforeachのような回し方ができる,のでとても楽

パラメータを,格好良くスラッシュ区切りで受け渡ししようと思って変更した

thread/@id/@threadId

そうしたら,テンプレートからのaタグによる遷移が変わるところではまった

スラッシュが入るごとに階層が深くなる扱いになるらしい

<a href="../../title">title</a>のような書き方をしないと遷移できない

合わせて,style.cssへのリンクの深さも,個々のテンプレートごとに変わってくる

cssは,ヘッダーのstyleタグに書くか,絶対パスで指定する方法を考えた

今回は後者にした

xfreeへのアップ

.gitは削除する

templates_cの中のファイルも,削除しないとエラーになることがある

パーミッションを変更する

パーミッションは,web ftpか(フォルダのアイコンをクリックするとその中に入れる)ftpソフトで変更できる

chmod 777 (アプリフォルダそのもの)

chmod 757 templates_c

chmod 777 sqlite.db

スレッドアプリの構造

自分で作ったものが後にわからなくなるので,備忘として。

github.com

機能

titleレコードごとに,複数のthreadレコードが紐付いている
5chの,スレッドタイトル一覧と,各スレの関係に似ている
upボタンを押すと,updatedの時刻が現在時刻となり,updatedでソートしているので,そのレコードを1番上に出すことができる

フレームワーク

  • flight
  • idiorm(orm)

サーバ

現在はxreassh接続できるのが良い。
flightidiormもファイルを置くだけでいいので,PHPが使えるレンサバなら同じように使える。

データベース

テーブル title

  • id
  • date
  • title
  • text
  • updated

テーブル thread

  • id
  • title_id(titleテーブルのレコードとの紐付け)
  • date
  • text
  • updated

ルーティング

ルーティング 働き
title_ins_exe titleレコードをinsertする
title_upd titleレコードをupdateするフォームを表示する
title_upd_exe DBをupdateする
title_up updatedを現在時刻にする
title_del titleレコードを削除する
title_list titleレコードのtitleフィールドのみを一覧表示
thread スレッドレコードの一覧表示
thread_ins_exe スレッドレコードをinsertする
thread_title_upd スレッド表示のところでtitleレコードをupdateするフォームを表示する
thread_title_upd_exe スレッド表示のところでtitleレコードをupdateする
thread_upd スレッドレコードをupdateするフォームを表示する
thread_upd_exe DBをupdateする
thread_del スレッドレコードを削除する
thread_up updatedを現在時刻にする
list titleレコードの一覧表示

pythonanywhereを試してみた

herokuより使いやすくてびっくり!

ormのdatasetも最初から入っている。

これまで検討したサービス

サービス名 検討
xfree(旧xdomain) pythonが使えない,ftpを使う
xrea pythonは使えるが,pip installはできない。cgiは使えるが……
heroku スリープする
GCP? 学習コストが高いかも

ネックは,3か月に1回,設定画面でボタンを押さないと消されるらしい

DB接続テスト

参考サイト

blog.codecamp.jp

dataset公式サイト
dataset.readthedocs.io

Webタブで,フレームワークでflaskを選択

Mysqlのコンソールで適当にデータを入れる

create table test(id int auto_increment primary key,text text);
insert into test (text) values ('hoge');

Dashboardタブ > ConsolesのBashのところで,vim/home/yaguchineko/mysiteにあるflaskアプリのファイルを編集する。
datasetを使ってDBのデータを表示させるテストをする。

# A very simple Flask Hello World app for you to get started with...

from flask import Flask
import dataset

app = Flask(__name__)

@app.route('/')
def hello_world():
    #return 'Hello from Flask'
    #db = dataset.connect('mysql://user:password@localhost/mydatabase')#DB接続のサンプル
    db = dataset.connect('mysql://usrname:password@Database host address/database's name
    mylist = []
    for row in db['test']:#1行ずつ取得
        mylist.append(row['text'])
    return mylist[0]  

これで,「hoge」の表示に成功

アプリを1つしか作れないこともネックなので,

/app1/hogehoge
/app2/foo
…

という形で,無理やり複数アプリを作ってルーティングしようと考えている